重要
\b--匹配单词的开始或结束,如:\bhello\b匹配hello字符串
\d--匹配数字0-9,可以表示出现的位数,如:0\d{3}-\d{8}表示加上区号的电话号码
\s--匹配任意的空白字符,包括空格,Tab,换行,中文全角空格
\w--匹配字母或数字或下划线或汉字
\B--匹配不是单词的开头或结束
\D--匹配任意非数字字符
\S--匹配不是空白符,如\S+匹配不包含空白符的字符串
\W--匹配任意不是数字,字母,下划线,汉字的字符
\u--使用16进制形式匹配Unicode字符,记住[\u4e00-\u9fa5]代表所以汉字字符
一般类
.--表示除了换行符之外的任意字符
^--匹配查找字符串的开头
$--匹配查找字符串的结尾(这两个和\b有点类似,而且没发现区别)
\--由于很多符号被用来做匹配工作了,如果要查找其本身的话就要用"\"来转义,如:\\,\*,\.,\(等
[abcd]--匹配其中出现的字符abcd的任何一个,如:[a-z0-9A-Z]匹配所以大小写字母和数字(注意写法)
[^abcd]--匹配不属于其中出现的字符abcd的其他任意字符
|--分枝条件,而且要注意出现的顺序,会从左到右检测,满足之后就不会去管其他条件
()--用来做子表达式,即是分组,如:(\d{1,3}\.){3}\d{1,3}匹配一个IP地址,更加正确的匹配IP:((2[04]\d|25[0- 5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?);(exp)匹配exp,并捕获文本到自动命名的组里,(? exp)或(?‘name‘exp)匹配exp,并捕获文本到自己命名的组里,取的时候可以用\k。(?:exp)匹配exp,不捕 获匹配的文本,当然也不分配组号。
贪婪匹配
正则表达式默认的是贪婪匹配,即在匹配的情况下尽可能多的匹配。如asbklsdjblkjjabsksdbss用a.*b去匹配的话会得到asbklsdjblkjjabsksdb字符串(尽管前面出现了好多次b也不会匹配,而找最长最多的那个)
懒惰匹配
如上的字符串如果以a.*?b来匹配的话得到的是asb,ab两个字符串,所以限定符都可以在后面加上?来支持懒惰匹配。如:*?,+?,??,{n}?等等都是尽可能少重复
限定类:
*--表示前一位可以出现任意次数(0次也可以),除换行符外
+--表示前一位可以出现任意次数(1次以上),除换行符外
?--表示前一位出现0次或1次
{n}--表示前一位出现n次
{n,}--表示前一位出现n次或更多次
{n,m}--表示前一位出现n次到m次
零宽断言
(?=exp)--零宽度正预测先行断言,如:\b\w+(?=ing\b)匹配以ing结尾的单词,但ing并不包括其中(零宽),dancing 结果是danc
(?<=exp)--零宽度正回顾后发断言,如:(?<=\bre)\w+\b匹配以re开头的单词,但re并不包括其中,reading结果是ading
(?!exp)--零宽度负预测先行断言,如:\b\w*q(?!u)\w*\b匹配任意位置(以*表示)出现q的单词但不接u的字符串
(?
练习:(?<=<(?\w+)>).*(?+\/\k)表示不包含属性的简单html标签内的内容(不包括前缀和尾缀)
注释
(?#comment)--注释,最好启用"忽略模式里的空白符"选项,这样在编写表达式的时候能任意添加空格,tab,换行。如:
(?<= # 断言要匹配的文本的前缀 <(\w+)> # 查找尖括号括起来的字母或数字(即HTML/XML标签)
) # 前缀结束
.* # 匹配任意文本
(?= # 断言要匹配的文本的后缀
<\/\1> # 查找尖括号括起来的内容:前面是一个"/",后面是先前捕获的标签
) # 后缀结束