1189 字
6 分钟
正则表达式基础用法
参考文献:正则表达式 30 分钟入门教程
普通
\
转义|
短路或[aeiou]
匹配任何一个英文元音字母[a-z0-9A-Z_]
匹配字母或数字或下划线
元字符
.
匹配除换行符以外的任意字符\w
匹配字母或数字或下划线或汉字\s
匹配任意的空白符\d
匹配数字\b
匹配单词的开始或结束^
匹配字符串的开始$
匹配字符串的结束
反义
\W
匹配任意不是字母,数字,下划线,汉字的字符\S
匹配任意不是空白符的字符\D
匹配任意非数字的字符\B
匹配不是单词开头或结束的位置[^x]
匹配除了 x 以外的任意字符[^aeiou]
匹配除了 aeiou 这几个字母以外的任意字符
贪婪重复限定符
*
重复零次或更多次+
重复一次或更多次?
重复零次或一次{n}
重复 n 次{n,}
重复 n 次或更多次{n,m}
重复 n 到 m 次
懒惰限定符
*?
重复任意次,但尽可能少重复+?
重复 1 次或更多次,但尽可能少重复??
重复 0 次或 1 次,但尽可能少重复{n,m}?
重复 n 到 m 次,但尽可能少重复{n,}?
重复 n 次以上,但尽可能少重复
分组
捕获
(exp)
匹配 exp,并捕获文本到自动命名的组里(?<name>exp)
匹配 exp,并捕获文本到名称为 name 的组里,也可以写成(?‘name’exp)(?:exp)
匹配 exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言
(?=exp)
零宽度正预测先行断言,匹配 exp 前面的位置(?<=exp)
零宽度正回顾后发断言,匹配 exp 后面的位置(?!exp)
零宽度负预测先行断言,匹配后面跟的不是 exp 的位置(?<!exp)
零宽度负回顾后发断言,匹配前面不是 exp 的位置
注释
(?#comment)
注释
处理选项
IgnoreCase
忽略大小写,匹配时不区分大小写。Multiline
多行模式,更改^
和$
的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,$
的精确含意是:匹配\n
之前的位置以及字符串结束前的位置.)Singleline
单行模式,更改.
的含义,使它与每一个字符匹配(包括换行符\n
)。IgnorePatternWhitespace
忽略空白,忽略表达式中的非转义空白并启用由#标记的注释。ExplicitCapture
显式捕获,仅捕获已被显式命名的组。
平衡组/递归匹配
(?'group')
把捕获的内容命名为 group,并压入堆栈(Stack)(?'-group')
从堆栈上弹出最后压入堆栈的名为 group 的捕获内容,如果堆栈本来为空,则本分组的匹配失败(?(group)yes|no)
如果堆栈上存在以名为 group 的捕获内容的话,继续匹配 yes 部分的表达式,否则继续匹配 no 部分(?!)
零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败
其他
\a
报警字符(打印它的效果是电脑嘀一声)\b
通常是单词分界位置,但如果在字符类里使用代表退格\t
制表符,Tab\r
回车\v
竖向制表符\f
换页符\n
换行符\e
Escape\0nn
ASCII 代码中八进制代码为 nn 的字符\xnn
ASCII 代码中十六进制代码为 nn 的字符\unnnn
Unicode 代码中十六进制代码为 nnnn 的字符\cN
ASCII 控制字符。比如\cC
代表 Ctrl+C\A
字符串开头(类似^,但不受处理多行选项的影响)\Z
字符串结尾或行尾(不受处理多行选项的影响)\z
字符串结尾(类似$,但不受处理多行选项的影响)\G
当前搜索的开头\p{name}
Unicode 中命名为 name 的字符类,例如\p{IsGreek}(?>exp)
贪婪子表达式(?<x>-<y>exp)
平衡组(?im-nsx:exp)
在子表达式 exp 中改变处理选项(?im-nsx)
为表达式后面的部分改变处理选项(?(exp)yes|no)
把 exp 当作零宽正向先行断言,如果在这个位置能匹配,使用 yes 作为此组的表达式;否则使用 no(?(exp)yes)
同上,只是使用空表达式作为 no(?(name)yes|no)
如果命名为 name 的组捕获到了内容,使用 yes 作为表达式;否则使用 no(?(name)yes)
同上,只是使用空表达式作为 no
常用正则表达式
(?<=<(\w+)>).*(?=<\/\1>)
匹配不包含属性的简单 HTML 标签内里的内容<div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>
匹配嵌套的标签[\u4e00-\u9fa5]
匹配中文^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
Email 地址[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
域名((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))
IP 地址^[a-zA-Z][a-zA-Z0-9_]{4,15}$
帐号(字母开头,允许 5-16 位,允许字母数字下划线)