元字符
. 任意字符,不含换行符* 任意多个字符,可以为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(只考虑英文时)| 分支条件符(\d{1,3}\.){3} 重复3次"\d{1,3}\."
反义代码
\W 任意不是字母,数字,下划线,汉字的字符\S 任意不是空白符的字符\D 任意非数字的字符\B 不是单词开头或结束的位置[^x] 除了x以外的任意字符[^aeiou] 除了aeiou这几个字母以外的任意字符
后向引用
\1 分组1匹配的文本(默认分组组号以分组时的左括号'('为准)(?<Word>\w+)(?'Word'\w+) 指定“\w+”的组名为“Word”,使用“\k<Word>”来引用
分组语法
捕获(exp) 匹配exp,并捕获文本到自动命名的组里(?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号零宽断言(?=exp) 匹配exp前面的位置(?<=exp) 匹配exp后面的位置(?!exp) 匹配后面跟的不是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)yes|no) 如果堆栈上存在以名为group的捕获内容的话,继续匹配 yes 部分的表达式,否则继续匹配no部分 (?!) 零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败如何把xx <aa <bbb> <bbb> aa> yy这样的字符串里,最长的配对的尖括号内的内容捕获出来:< #最外层的左括号[^<>]* #最外层的左括号后面的不是括号的内容(((?'Open'<) #碰到了左括号,向堆栈压入一个"Open"[^<>]* #匹配左括号后面的不是括号的内容)+((?'-Open'>) #碰到了右括号,从堆栈弹出最后压入的"Open"[^<>]* #匹配右括号后面不是括号的内容)+)*(?(Open)(?!)) #在遇到最外层的右括号前面,判断黑板上还有没有没擦掉的"Open";如果还 有,则匹配失败> #最外层的右括号匹配嵌套的<div>标签:<div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>