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换行符\eEscape\0nnASCII 代码中八进制代码为 nn 的字符\xnnASCII 代码中十六进制代码为 nn 的字符\unnnnUnicode 代码中十六进制代码为 nnnn 的字符\cNASCII 控制字符。比如\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 位,允许字母数字下划线)