menu Chancel's blog
rss_feed
Chancel's blog
我就是这样的人

正则表达式基础复习手册

作者:Chancel, 更新:2019 Apr 03, 字数:3323, 已阅:756

这篇文章更新于 1524 天前,文中部分信息可能失效,请自行甄别无效内容。

正则表达式每次都看教程很麻烦,而且只是忘了某个点怎么用,于是简单做了下提纲,以供背(查)诵(询)使用

基础部分

元字符

  • 元字符代码说明
代码 说明
. 匹配除了换行符以外的任意字符
\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}

转义、重复(限定符)、特定字符

  • 转义
    • 使用正斜杠 - /
  • 限定符
代码 说明
* 重复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)
    • 零宽度负回顾后发断言
      • (?&lt;!exp)
  • 例子

    • 后向引用
      • 匹配 重复的单词
      • \b(\w+)\b\s+\1\b
    • 零宽度正预测先行断言
      • 匹配 以ing结尾的单词前面部分
      • \b\w+(?=ing\b)
    • 零宽度正回顾后发断言
      • 匹配 以re开头的单词后半部分
      • (?&lt;=\bre)\w+\b
    • 零宽度负预测先行断言
      • 匹配 三位数字且三位数字后面不能是数字
      • \d{3}(?!\d)
    • 零宽度负回顾后发断言
      • 匹配前面不是小写字母的七位数字
      • (?&lt;![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
  • 懒惰限定符

代码 说明
*? 重复任意次,但尽量少重复
+? 重复1次或更多次,但尽量少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复

处理选项

  • 处理选项列表(多见于.Net)
名称 说明
IgnoreCase(忽略大小写) 匹配时不区分大小写。
Multiline(多行模式) 更改^和$的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,$的精确含意是:匹配\n之前的位置以及字符串结束前的位置.)
Singleline(单行模式) 更改.的含义,使它与每一个字符匹配(包括换行符\n)。
IgnorePatternWhitespace(忽略空白) 忽略表达式中的非转义空白并启用由#标记的注释。
ExplicitCapture(显式捕获) 仅捕获已被显式命名的组。

NOTE:单行模式与多行模式可以同时使用

参考资料

参考资料:正则表达式30分钟入门教程


[[replyMessage== null?"发表评论":"发表评论 @ " + replyMessage.m_author]]

account_circle
email
web_asset
textsms

评论列表([[messageResponse.total]])

还没有可以显示的留言...
[[messageItem.m_author]] [[messageItem.m_author]]
[[messageItem.create_time]]
[[getEnviron(messageItem.m_environ)]]
[[subMessage.m_author]] [[subMessage.m_author]] @ [[subMessage.parent_message.m_author]] [[subMessage.parent_message.m_author]]
[[subMessage.create_time]]
[[getEnviron(messageItem.m_environ)]]
目录