一、元字符
我们先来记几个常用的元字符:
元字符
|
说明
|
---|---|
.
|
匹配除换行符以外的任意字符
|
\w
|
匹配字母或数字或下划线或汉字
|
\s
|
匹配任意的空白符
|
\d
|
匹配数字
|
\b
|
匹配单词的开始或结束
|
^
|
匹配字符串的开始
|
$
|
匹配字符串的结束
|
\babc或者^abc
^\d\d\d\d\d\d\d\d$
^1\d\d\d\d\d\d\d\d\d\d$
二、反义
元字符
|
解释
|
---|---|
\W
|
匹配任意不是字母,数字,下划线,汉字的字符
|
\S
|
匹配任意不是空白符的字符
|
\D
|
匹配任意非数字的字符
|
\B
|
匹配不是单词开头或结束的位置
|
[^x]
|
匹配除了x以外的任意字符
|
[^aeiou]
|
匹配除了aeiou这几个字母以外的任意字符
|
三、重复限定符(花括号)
语法
|
说明
|
---|---|
*
|
重复零次或更多次
|
+
|
重复一次或更多次
|
?
|
重复零次或一次
|
{n}
|
重复n次
|
{n,}
|
重复n次或更多次
|
{n,m}
|
重复n到m次
|
^\d{8}$
^1\d{10}$
^\d{14,18}$
^ab*$
四、分组(圆括号)
^(ab)*
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
\d{1,3}(\.\d{1,3}){3}
<title>.*</title>
<(title)>.*</\1>
五、转义(反斜杠)
^(\(ab\))*
六、 条件或(竖线)
^(130|131|132|155|156|185|186|145|176)\d{8}$
七、区间(方括号)
-
限定0到9 可以写成[0-9]
-
限定A-Z 写成[A-Z]
-
限定某些数字 [165]
^((13[0-2])|(15[56])|(18[5-6])|145|176)\d{8}$
八、非捕获组
语法
|
含义
|
---|---|
(exp)
|
匹配 exp,并捕获文本到自动命名的组里
|
(?<name>exp)
|
匹配 exp,并捕获文本到名称为 name 的组里,也可以写成 (?'name'exp)
|
(?:exp)
|
匹配 exp,不捕获匹配的文本,也不给此分组分配组号
|
(?=exp)
|
匹配 exp 前面的位置
|
(?<=exp)
|
匹配 exp 后面的位置
|
(?!exp)
|
匹配后面跟的不是 exp 的位置
|
(?<!exp)
|
匹配前面不是 exp 的位置
|
(?#comment)
|
对正则表达式的处理没有任何影响,只是用于提供注释让人阅读
|
九、零宽断言
-
(?=exp)叫零宽度正预测先行断言,它断言此位置的后面能匹配表达式exp。比如[a-z]*(?=ing)匹配以ing结尾的单词的前面部分(除了ing以外的部分),查找I love cooking and singing时会匹配出中的cook与sing。先行断言的执行步骤应该是从要匹配字符的最右端找到第一个“ing”,再匹配前面的表达式,如无法匹配则查找第二个“ing”。
-
(?<=exp)叫零宽度正回顾后发断言,它断言此位置的前面能匹配表达式exp。比如(?<=abc).*匹配以abc开头的字符串的后面部分,可以匹配abcdefgabc中的defgabc而不是abcdefg。通过比较很容易看出后发断言和先行断言正好相反:它先从要匹配的字符串的最左端开始查找断言表达式,之后再匹配后面的字符串,如果无法匹配则继续查找第二个断言表达式。
-
(?!exp)叫零宽度负预测先行断言,断言此位置的后面不能匹配表达式exp。比如\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词,查找“abc123, ade123”这个字符串,可以匹配出ade123。
-
(?<!exp)叫零宽度负回顾后发断言,断言此位置的前面不能匹配表达式exp。比如(?<![a-z])\d{7}匹配前面不是小写字母的七位数字。还有一个复杂的例子:(?<=<(\w+)>).*(? =</\1>),用于匹配不包含属性的简单HTML标记内的内容。比如可以从 <div>test</div> 中提取出“test”。
十、贪婪和非贪婪
\d{3,6}
文本:61762828 176 2991 44 871
贪婪模式:\d{3,6}
匹配结果1:617628
匹配结果2:176
匹配结果3:2991
匹配结果4:871
文本:61762828 176 2991 87321
贪婪模式:(\d{1,2})(\d{3,4})
匹配结果1:617628
匹配结果2:2991
匹配结果3:87321
代码
|
说明
|
---|---|
*?
|
重复任意次,但尽可能少重复
|
+?
|
重复1次或更多次,但尽可能少重复
|
??
|
重复0次或1次,但尽可能少重复
|
{n,m}?
|
重复n到m次,但尽可能少重复
|
{n,}?
|
重复n次以上,但尽可能少重复
|
文本:61762828 176 2991 87321
贪婪模式:(\d{1,2}?)(\d{3,4})
匹配结果1:61762
匹配结果2:2991
匹配结果3:87321