正则表达式基础复习手册
warning 这篇文章距离上次更新于1146天前,文中部分信息可能已失效,请自行甄别无效内容。
正则表达式每次都看教程很麻烦,而且只是忘了某个点怎么用,于是简单做了下提纲,以供背(查)诵(询)使用
基础部分元字符
- 元字符代码说明
代码 | 说明 |
---|---|
. | 匹配除了换行符以外的任意字符 |
\w | 匹配字母/数字/下划线/汉字 |
\s | 匹配任意空白符 |
\d | 匹配任意数字 |
\b | 匹配单词的开始/结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
- 例子
- 匹配 hi
- \bhi\b
- 匹配 hi 后面带lucy
- \bhi\b.*\bLucy\b
- 匹配 中国电话号码
- 0\d\d-\d\d\d\d\d\d\d\d
- 缩写:0\d{2}-\d{8}
- 匹配 hi
转义、重复(限定符)、特定字符
- 转义
- 使用正斜杠 -
/
- 限定符
- 使用正斜杠 -
/
代码 | 说明 |
---|---|
* | 重复0次或者多次 |
+ | 重复1次或者多次 |
? | 重复0次或者1次 |
{n} | 重复N次 |
{n,} | 重复N次或者更多次 |
{n,m} | 重复N次或者M次 |
特定字符
- 使用中括号 []
例子
- 转义
- 匹配 chancel.cn
- chancel.cn
- 限定符
- Windows\d+ 匹配Windows后面跟1个或者多个数字
- ^\w+ 匹配行开始的第一个单词(直到有空格)
- 特定字符
- [aeiou] : 匹配aeiou中的任意一个
- (?0\d{2}[) -]?\d{8} : 匹配较为复杂电话号码,如(010)88886666
- 转义
分枝条件、分组以及反义
分枝条件
- 分支条件指的是当筛选的数据有多种规则时,满足其中一种规则即可当成匹配,使用符号:
|
分组(子表达式)
- 使用小括号:
()
反义
分枝条件
- 分支条件指的是当筛选的数据有多种规则时,满足其中一种规则即可当成匹配,使用符号:
|
分组(子表达式)
- 使用小括号:
()
反义
代码 | 说明 |
---|---|
\W | 匹配所有不是字母/数字/下划线/汉子的字符 |
\S | 匹配所有不是空白符的条件 |
\D | 匹配所有非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的所有字符 |
[^aeiou] | 匹配除了aeiou外的所有字符 |
- 例子
- 分枝条件
- 匹配 3位区号、4位区号的电话号码
- 0\d{2}-\d{8}|0\d{3}-\d{7}
- 分组(子表达式)
- 匹配 IP地址
- (\d{1,3}.){3}\d{1,3}
- 反义
- 匹配 不包含空白符的字符串
- \S+
- 分枝条件
向后引用、零宽断言
- 后向引用
- 说明:即使用小括号指定一个子表达式,并命名这个子表达式之后,在表达式后面可以使用名称来引用这个子表达式。
- 说明:即使用小括号指定一个子表达式,并命名这个子表达式之后,在表达式后面可以使用名称来引用这个子表达式。
分类 | 代码/语法 | 说明 |
---|---|---|
捕获 | (exp) | 匹配exp,并捕获文本到自动命名的组里 |
捕获 | (?<name>exp) | 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp) |
捕获 | (?:exp) | 匹配exp,不捕获匹配的文本,也不给此分组分配组号 |
零宽断言 | (?=exp) | 匹配exp前面的位置 |
零宽断言 | (?<=exp) | 匹配exp后面的位置 |
零宽断言 | (?!exp) | 匹配后面跟的不是exp的位置 |
零宽断言 | (?<!exp) | 匹配前面不是exp的位置 |
注释 | (?#comment) | 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读 |
零宽断言
- 零宽度正预测先行断言
- (?=exp)
- 零宽度正回顾后发断言
- (?<=exp)
- 零宽度正预测先行断言
负向零宽断言
- 零宽度负预测先行断言
- (?!exp)
- 零宽度负回顾后发断言
- (?<!exp)
- 零宽度负预测先行断言
例子
- 后向引用
- 匹配 重复的单词
- \b(\w+)\b\s+\1\b
- 零宽度正预测先行断言
- 匹配 以ing结尾的单词前面部分
- \b\w+(?=ing\b)
- 零宽度正回顾后发断言
- 匹配 以re开头的单词后半部分
- (?<=\bre)\w+\b
- 零宽度负预测先行断言
- 匹配 三位数字且三位数字后面不能是数字
- \d{3}(?!\d)
- 零宽度负回顾后发断言
- 匹配前面不是小写字母的七位数字
- (?<![a-z])\d{7}
- 后向引用
注释
要包含注释的话,最好是启用“忽略模式里的空白符”选项,这样在编写表达式时能任意的添加空格,Tab,换行,而实际使用时这些都将被忽略。启用这个选项后,在#后面到这一行结束的所有文本都将被当成注释忽略掉。
语法注释
- 语法:(?#comment)
- 2[0-4]\d(?#200-249)|250-5|[01]?\d\d?(?#0-199)。
忽略模式里的空白符
(?<= # 断言要匹配的文本的前缀
<(\w+)> # 查找尖括号括起来的字母或数字(即HTML/XML标签)
) # 前缀结束
.* # 匹配任意文本
(?= # 断言要匹配的文本的后缀
<\/\1> # 查找尖括号括起来的内容:前面是一个"/",后面是先前捕获的标签
) # 后缀结束
高阶部分贪婪与懒惰
贪婪(默认)
- 匹配尽量多的字符
- 例子
- aabab
- a.*b将匹配到整个字符串
懒惰
- 尽量匹配到少的字符串
- 例子
- aabab
- a.*?b将匹配到aab
懒惰限定符
要包含注释的话,最好是启用“忽略模式里的空白符”选项,这样在编写表达式时能任意的添加空格,Tab,换行,而实际使用时这些都将被忽略。启用这个选项后,在#后面到这一行结束的所有文本都将被当成注释忽略掉。
语法注释
- 语法:(?#comment)
- 2[0-4]\d(?#200-249)|250-5|[01]?\d\d?(?#0-199)。
忽略模式里的空白符
(?<= # 断言要匹配的文本的前缀
<(\w+)> # 查找尖括号括起来的字母或数字(即HTML/XML标签)
) # 前缀结束
.* # 匹配任意文本
(?= # 断言要匹配的文本的后缀
<\/\1> # 查找尖括号括起来的内容:前面是一个"/",后面是先前捕获的标签
) # 后缀结束
贪婪与懒惰
贪婪(默认)
- 匹配尽量多的字符
- 例子
- aabab
- a.*b将匹配到整个字符串
懒惰
- 尽量匹配到少的字符串
- 例子
- aabab
- a.*?b将匹配到aab
懒惰限定符
代码 | 说明 |
---|---|
*? | 重复任意次,但尽量少重复 |
+? | 重复1次或更多次,但尽量少重复 |
?? | 重复0次或1次,但尽可能少重复 |
{n,m}? | 重复n到m次,但尽可能少重复 |
{n,}? | 重复n次以上,但尽可能少重复 |
处理选项
- 处理选项列表(多见于.Net)
名称 | 说明 |
---|---|
IgnoreCase(忽略大小写) | 匹配时不区分大小写。 |
Multiline(多行模式) | 更改^和$的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,$的精确含意是:匹配\n之前的位置以及字符串结束前的位置.) |
Singleline(单行模式) | 更改.的含义,使它与每一个字符匹配(包括换行符\n)。 |
IgnorePatternWhitespace(忽略空白) | 忽略表达式中的非转义空白并启用由#标记的注释。 |
ExplicitCapture(显式捕获) | 仅捕获已被显式命名的组。 |
NOTE:单行模式与多行模式可以同时使用
参考资料
阅读:
604
分类:
杂锦记录
创建时间:
2019-04-03 15:44:07
更新时间:
2019-04-03 15:44:07
博文目录
[[replyMessage== null?"发表评论":"@" + replyMessage.m_author]]
account_circle
email
web_asset
textsms
评论列表([[messageResponse.total]])
[[messageItem.m_author]]
[[messageItem.m_author]]
[[getEnviron(messageItem.m_environ)]]
[[subMessage.m_author]]
[[subMessage.m_author]]
@
[[subMessage.parent_message.m_author]]
[[subMessage.parent_message.m_author]]
[[getEnviron(messageItem.m_environ)]]