正则表达式学习总结

元字符

.                任意字符,不含换行符

*                任意多个字符,可以为0个

?                单个字符

\n                换行符

\s                任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等(注意s为小写)

\d                数字

\w                字母、数字、下划线或汉字

\b                单词的开始或结束

^                字符串的开始

$                字符串的结束

转义字符

\.                ".”

\*                "*”

\\                "\”自身

\(                "(”

需要使用转义字符的字符有    .    *    ?    ^    $    +    \    (    )    [    ]    {    }

限定符

*                    重复零次或更多次

+                    重复一次或更多次

?                    重复零次或一次

{n}                重复n次

{n,}                重复n次或更多次

{n,m}            重复n到m次

分支条件符

字符示例

[0-9]                    单个数字,等价于\d

[aeiou]                a、e、i、o或u

[a-z0-9A-Z_]        大小写字母、数字及下划线,等价于\w(只考虑英文时)

反义代码

\W                任意不是字母,数字,下划线,汉字的字符

\S                任意不是空白符的字符

\D                任意非数字的字符

\B                不是单词开头或结束的位置

[^x]            除了x以外的任意字符

[^aeiou]        除了aeiou这几个字母以外的任意字符

后向引用

\1                            分组1匹配的文本(默认分组组号以分组时的左括号’('为准)

(?\w+)

(?‘Word’\w+)            指定“\w+”的组名为“Word”,使用“\k”来引用

捕获

(exp)                    匹配exp,并捕获文本到自动命名的组里

(?exp)    匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name’exp)

(?:exp)                    匹配exp,不捕获匹配的文本,也不给此分组分配组号

注释

(?#comment)        这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

零宽断言

(?=exp)           零宽度正预测先行断言,断言其后为exp

(?<=exp)        零宽度正回顾后发断言,断言其前为exp

(?!exp)            零宽度负预测先行断言,断言其后不为exp

(?<!exp)          零宽度负回顾后发断言,断言其前不为exp

此处exp不应为.*等通配符,否则出错

例:

(?=exp)

断言自身出现的位置的后面能匹配表达式exp

对于“I’m dancing”,表达式“\b\w+(?=ing\b)”会匹配“ing\b”前的“danc”

(?<=exp)

断言自身出现的位置的前面能匹配表达式exp

对于“I’m reading”,表达式“(?<=\bre)\w+\b”会匹配“\bre”后的“ading”

平衡组/递归匹配

(?‘group’)       把捕获的内容命名为group,并压入堆栈(Stack)

(?‘-group’)      从堆栈上弹出最后压入堆栈的名为group 的捕获内容,如果堆栈本来为空,则本分组的匹配失败

(?(group)yesno)     如果堆栈上存在以名为group的捕获内容的话,继续匹配 yes 部分的表达式,否则继续匹配no部分

(?!)                 零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败

举例

如何把xx <aa aa> yy这样的字符串里,最长的配对的尖括号内的内容捕获出来:

<                            #最外层的左括号

[^<>]*                #最外层的左括号后面的不是括号的内容

(

(

(?‘Open’<)    #碰到了左括号,向堆栈压入一个"Open"

[^<>]*            #匹配左括号后面的不是括号的内容

)+

(

(?‘-Open’>)    #碰到了右括号,从堆栈弹出最后压入的"Open"

[^<>]*            #匹配右括号后面不是括号的内容

)+

)*

(?(Open)(?!))        #在遇到最外层的右括号前面,判断黑板上还有没有没擦掉的"Open";如果还 有,则匹配失败

>                                #最外层的右括号

匹配嵌套的
标签:

<div[^>]*>[^<>]*(((?‘Open’<div[^>]*>)[^<>]*)+((?‘-Open’

)[^<>]*)+)*(?(Open)(?!))