正则表达式总结
在JavaScript中用正则表达式是最常见不过了,正则看起来像天书,理解了之后其实不难,下面我将总结一下各种正则字符的意思。客官请慢用:
元字符
符号 | 含义 |
---|---|
\b |
元字符,代表单词的开头或结尾,也就是单词的分界处,不匹配任意一个字符,只匹配一个位置 |
. |
元字符,匹配除了换行符以外的任意字符 |
* |
可以连续重复使用任意次 |
\w |
匹配字母或数字或下划线 |
\s |
匹配空格符 |
\d |
匹配数字 |
^ |
匹配字符串开始 |
$ |
匹配字符串结束 |
重复
符号 | 含义 |
---|---|
* |
重复0次或多次 |
+ |
重复1次或多次 |
? |
重复0次或1次 |
{n} |
重复N次 |
{n, } |
重复N次或更多次 |
{n, m} |
重复n到m次 |
字符类
符号 | 含义 |
---|---|
[] |
匹配[] 中的任意一个字符 |
例子:匹配(010)88886666
或022-22334455
或02912345678
,
正则表达式: /\(?0\d{2}[-\)]?\d{8}/
分支条件
上述表达式中也能匹配010)12345678
或(022-87654321
这样的“不正确”的格式。要解决这个问题要用到分支条件。所以上述的正则表达式可以改写为/\(?0\d{2}\)[-]?\d{8}|0\d{2}[-]?\d{8}/
符号 | 含义 |
---|---|
` | ` |
分组
重复多个字符时,可以使用()
来表示。比如:(\d{1,3}\.){3}\d{1,3}
是一个简单的IP地址匹配。
然而像256.300.888.999
这种不可能存在的IP地址。所以我们改写一下,一个正确的IP地址正则表达式应该是/((2[0-4]\d|25[0-5]|[01]?\d?\d)\.){3}(2[0-4]\d|25[0-5]|[01]?\d?\d)/
反义
符号 | 含义 |
---|---|
\W |
匹配任意不是字母,数字,下划线,汉字的字符 |
\S |
匹配任意不是空白符的字符 |
\D |
匹配任意非数字的字符 |
\B |
匹配不是单词开头或结束的位置 |
[^x] |
匹配除了x以外的任意字符 |
[^aeiou] |
匹配除了aeiou这几个字母以外的任意字符 |
后向引用
使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是捕获的内容)。默认情况下,每个分组会自动拥有一个组号,规则是:从左往右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推
符号 | 含义 |
---|---|
\1 \2 \3 ... \n |
表示匹配第N个出现的捕获组 |
\k<Word> |
自定义捕获组 |
(?:exp) |
表示匹配exp,但不捕获匹配的文本,也不给此分组分配组号 |
(这里面的性质JavaScript暂不支持)也可以指定子表达式的组名。比如:<Word>\w+
要引用这个自定义的子表达式可以用\k<Word>
零宽断言
用于查找在某些内容(但并不包括这些内容)之前或之后的东西,也就是说它们像\b
,^
,$
那样用于指定一个位置,这个位置应该满足一定的条件(断言),因此它们也被称为零宽断言。
符号 | 含义 |
---|---|
(?=exp) |
也叫零宽度正预测先行断言,匹配符合exp的前面的正则的内容。比如\b\w+(?=ing\b) ,匹配以ing结尾的单词的前面部分(除了ing以外的\w+ 部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。 |
(?<=exp) |
也叫零宽度正回顾后发断言,它的作用与(?=exp) 相反,匹配符合exp之后的正则的内容。比如(?<=\bre)\w+\b 会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,他会匹配ading。(这里面的性质JavaScript暂不支持) |
负向零宽断言
符号 | 含义 |
---|---|
(?!exp) |
也叫零宽度负预测先行断言,断言此位置的后面不能匹配表达式exp。例如:\d{3}(?!\d) 匹配三位数字,而且这三位数字的后面不能是数字。 |
(?<!exp) |
也叫零宽度负回顾后发断言,与上面的(?!exp) 含义相反,表示断言此位置的前面不能匹配表达式exp。例如:(?<![a-z])\d{7} 匹配前面不是小写字母的七位数字(这里面的性质JavaScript暂不支持) |
参考链接: