正则表达式学习(二)

参考:正则表达式30分钟入门教程

(很好用的)正则表达式在线测试  (英文)

五、字符类(由"["和"]"括起来的,用于匹配其中任意一个字符)

也可以表示范围,如[0-9],[a-zA-Z]

六、转义字符,使用元字符本身时需要转义,如“(”和")"和“/”“^”"$"。

在字符类即[ ]里面,使用元字符时不需要转义。匹配一个元字符:

[()/^$]

七、分支条件

正则表达式里的分枝条件指的是有几种规则,如果满足其中任意一种规则都应该当成匹配,具体方法是用|把不同的规则分隔开。

注意:匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。

八、分组

由"("")"  所指定的子表达式。

用途一:分组能够实现 子表达式 的重复

((2[0-4]d|25[0-5]|[01]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd?)
匹配一个正确的IP地址

用途二:在JS关于正则表达式的方法exec()、match(),在成功匹配字符串时,会返回字符串数组(整个字符串、子表达式字符串......)

1 var reg = /((2[0-4]d|25[0-5]|[01]?dd?).){3}(2[0-4]d|25[0-5]|[01]?dd?)/
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" ]

九、反义

表3.常用的反义代码
代码/语法说明
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’表示匹配到的内容。

原文地址:https://www.cnblogs.com/dayofcoder/p/10764624.html