(很好用的)正则表达式在线测试 (英文)
五、字符类(由"["和"]"括起来的,用于匹配其中任意一个字符)
也可以表示范围,如[0-9],[a-zA-Z]
六、转义字符,使用元字符本身时需要转义,如“(”和")"和“/”“^”"$"。
在字符类即[ ]里面,使用元字符时不需要转义。匹配一个元字符:
[()/^$]
七、分支条件
正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开。
注意:匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。
八、分组
由"("")" 所指定的子表达式。
用途一:分组能够实现 子表达式 的重复
((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) 匹配一个正确的IP地址
用途二:在JS关于正则表达式的方法exec()、match(),在成功匹配字符串时,会返回字符串数组(整个字符串、子表达式字符串......)
1 var reg = /((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/
2
3 123.123.123.123".match(reg)
4 #Array(4) [ "123.123.123.123", "123.", "123", "123" ]
5
6 reg.exec("225.255.254.255")
7 #Array(4) [ "225.255.254.255", "254.", "254", "255" ]
九、反义
代码/语法 | 说明 |
---|---|
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
十、零宽断言
JS仅支持正向零宽断言,不支持负向(ES7的建议)(终于是正则表达式的大难点到了,真的难懂也难解释)。
(?=exp)匹配exp前面的文本、
(?:exp)匹配exp,不捕获匹配的文本,也不给此分组分配组号、
(?!exp) 匹配后面不是exp的文本。不消费任何字符。
十一、贪婪与懒惰
代码/语法 | 说明 |
---|---|
*? | 重复任意次,但尽可能少重复 |
+? | 重复1次或更多次,但尽可能少重复 |
?? | 重复0次或1次,但尽可能少重复 |
{n,m}? | 重复n到m次,但尽可能少重复 |
{n,}? | 重复n次以上,但尽可能少重复 |
十二、通过标志进行高级搜索
标志 | 描述 |
---|---|
g | 全局搜索。 |
i | 不区分大小写搜索。 |
m | 多行搜索。 |
y | 执行“粘性”搜索,匹配从目标字符串的当前位置开始,可以使用y标志。 |
十三、 JS replace()
stringObject.replace(regexp/substr,replacement)
$$ | Inserts a "$".(插入一个'$'字符) |
$& | Inserts the matched substring.(插入匹配的子字符串) |
$` | Inserts the portion of the string that precedes the matched substring.(插入匹配的子字符串左侧文本) |
$' | Inserts the portion of the string that follows the matched substring.(插入匹配的字符串右侧文本) |
$n | Where n is a positive integer less than 100, inserts the nth parenthesized submatch string, provided the first argument was a RegExp object. Note that this is 1-indexed.(与 regexp 中的第 1 到第 99 个子表达式相匹配的文本) |
用法:
1 var re = /(\w+)\s(\w+)/;
2 var str = 'John Smith';
3 var newstr = str.replace(re, '$2, $1');
4 console.log(newstr); // Smith, John
一道很好的题:
给数字每三位添加一个逗号
1 var str = '1234567890';
2 str = str.replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,'$1,');
简要解释:这里(\d{1,3}) 表示匹配一位到三位数字的一串字符,而(?=(?:\d{3})+(?!\d))表示匹配三的整数倍的数字且不以数字结尾的一串字符(注意(?!exp)不消费字符,如“123”也属于\d+(?!\d)能匹配到的字符串)。
所以如果是一串数字进行匹配的话,一次匹配就匹配到字符串前面的一到三位。
如:“123456” 匹配到“123”,而“1234567”则匹配到“1”而已。
开启全局匹配(g)后,“1234567”进行两次匹配,匹配到“1”、“234”,而这些都是第一个子表达式(即(\d{1,3}))匹配到的,故使用参数‘$1’表示匹配到的内容。