正则表达式是通配符的增强版,可以匹配指定规则的字符串。可以通过在线测试工具来测试。
一 限定符
-
?前面的字符需要出现0次或一次
-
*前面的字符可以出现0次或多次
例ab*c代表ac之间可以出现0次或多次b,但不能有其他字符
-
+前面的字符需要出现多次
-
{}可以指定前面的字符出现的次数,例ab{6}c
-
{}也可以指定出现次数的范围,例ab{2,6}c
-
{}也可以指定至少几次,例ab{2,}c
-
注:()可以匹配多个字符,例(ab)+
二 "或"运算
-
|为或运算符,例a (cat|dog)会匹配a cat和a dog
三 字符类
-
[]代表所匹配的字符必须取自[]中,即[ab]等同于a
-
[]中也可以写范围,a-z,A-Z,0-9
-
[a-zA-Z0-9]代表所有字母和数字
-
-
脱字符(^)代表除[]内列的以外的字符
五 元字符
-
\d代表数字字符,等同于[0,9]
-
\w代表"单词"字符,包括所有英文字符,数字字符和下划线
-
\s代表空白符(包括Tab和换行符)
-
\D代表非数字字符,\W代表非单词字符,\S代表非空白字符
-
.代表除了换行符的任意字符
-
^会匹配行首,$会匹配行尾
例,^a只会匹配行首的a,b$只会匹配行尾的b
六 贪婪与懒惰匹配
<span>This is a test</span>
这种情况我们想要匹配标签,很容易会想到<.+>,但是这样整行都会被匹配,原因是.+会尽可能多的匹配字符,解决办法就是改成<.+?>,它会将正则表达式中默认的贪婪匹配改成懒惰匹配。
七 分组
由括号括起来即成为一组。
比如(\d{1,3}\.){3}\d{1,3}是匹配ip
八 后向引用
后向引用用于重复搜索前面某个分组匹配的文本。例如,\1代表分组1匹配的文本。
比如\b(\w+)\b\s+\1\b可以用来匹配重复的单词。
九 零宽断言
(?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp。比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。
(?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。
十 负向零宽断言
零宽度负预测先行断言(?!exp),断言此位置的后面不能匹配表达式exp。例如:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字;\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词。
同理,我们可以用(?<!exp),零宽度负回顾后发断言来断言此位置的前面不能匹配表达式exp:(?<![a-z])\d{7}匹配前面不是小写字母的七位数字。
其他
- \b可以代表单词字符的边界
- \.反斜杠作为转义,表示.
- 注释:(?#comment)