Regex记录

141 阅读3分钟

《正则表达式必知必会》记录

正则表达式(Regular Expression)

由字符构成的字符串,用来匹配和处理文本,例如搜索和替换

术语

待匹配的内容称为文本,正则表达式称为模式(可能是搜索模式或替换模式),执行匹配后会产生结果。

匹配单个字符

  1. 匹配普通文本,且正则表达式区分大小写。例如:Ben
  2. 匹配任意字符:.
  3. 匹配特殊字符,需要使用转义字符:\。例如:.用于匹配任意字符,如果需要匹配小数点使用\.

匹配字符集合

  1. 匹配多个字符中的某一个:[character set],字符之间是or的关系。例如:[123]用于匹配1,2,3中的任一字符。
  2. 利用字符集合区间:[start-end]。例如:[0-9A-Za-z]匹配数字/大小写字母的任一字符。
  3. 排除字符集合制定的字符:[^character set]。例如:[^0-9]匹配非数字。

使用元字符

  1. 匹配空白字符:[\b], \f, \n, \r, \t, \v.
  2. 匹配特定的字符类型:数字(\d, \D), 字母数字(\w, \W), 空白字符(\s, \S), 匹配十六进制或八进制数值(\x, \0). 大写字符为小写字符的排除集合。

重复匹配

  1. 匹配一个或多个字符:+
  2. 匹配零个或多个字符:*
  3. 匹配零个或一个字符:?
  4. 具体的重复匹配:{n}。例如:{3}
  5. 匹配区间:{m,n}。例如:{1,3}
  6. 匹配至少重复多少次:{m,}。例如:{2,}
  7. 量词是贪婪的,防止过度匹配,需要在贪婪型量词后加上?.例如:.?, *?, {n,}?

位置匹配

  1. 边界(指定模式前后位置的特殊元字符)
  2. 单词边界:\b用于匹配一个单词的开头或结尾。
  3. 字符串边界:^代表字符串开头,$代表字符串结尾。
  4. 多行模式:(?m), 使用时(?m)必须出现在整个模式的最前面。

子表达式(subexpression)

  1. 使用子表达式进行分组:(),每个子表达式可以用\n引用,n从1开始计数。
  2. 子表达式支持嵌套。

反向引用(backreference)

  1. 反向引用匹配。子表达式对模式分组,将其标识出来以备后用。
  2. 替换操作,涉及到两个正则表达式,一个用来指定搜索模式(引用子表达式\1),一个用来指定替换模式(引用子表达式$1)。
  3. 大小写替换:\E, \l, \L, \u, \L

环视(lookaround, 向前lookahead, 向后lookbehind)

  1. 向前:(?=),需要出现在子表达式里,后边跟要匹配的文本。
  2. 向后:(?<=),需要出现在子表达式里,后边跟要匹配的文本。
  3. 结合向前向后查看。
  4. 否定式环视(negative lookaround):用!替换=, 即否定向前:?!,否定向后:?<!.

嵌入式条件

  1. 正则表达式里的条件(?匹配前一个字符表达式,?=?<=匹配前面或后面的文本)
  2. 反向引用条件。例如:(?(1))检查第一个反向引用是否存在。
  3. 环视条件。例如:(?(?=-)-\d{4})检查后边是否有-,如果有则继续匹配-和四个数字。

基本字符表快速索引

基本的元字符

元字符说明
.匹配任意单个字符
|逻辑或操作符
[]匹配该字符集合中的一个字符
[^]排除该字符集合
-定义一个范围(例如[A-Z])
\对下一个字符转义

量词元字符

元字符说明
*匹配前一个字符(子表达式)的零次或多次重复
*?*的懒惰型版本
+匹配前一个字符(子表达式)的一次或多次重复
+?+的懒惰型版本
匹配前一个字符(子表达式)的零次或一次重复
{n}匹配前一个字符(子表达式)的n次重复
{m,n}匹配前一个字符(子表达式)的至少m次至多n次重复
{n,}匹配前一个字符(子表达式)的n次或更多次重复
{n,}?{n,}的懒惰型版本

位置元字符

元字符说明
^匹配字符串的开头
\A匹配字符串的开头
$匹配字符串的结尾
\Z匹配字符串的结尾
\<匹配单词的开头
\>匹配单词的结尾
\b匹配单词边界(开头和结尾)
\B\b的反义

匹配模式

元字符说明
(?m)多行模式

特殊字符元字符

元字符说明
[\b]退格字符
\c匹配一个控制字符
\d匹配任意数字字符
\D\d的反义
\f换页符
\n换行符
\r回车符
\s匹配任意空白字符
\S\s的反义
\t制表符(Tab键)
\v垂直制表符
\w匹配任意字母数字字符或下划线字符
\W\w的反义
\x匹配一个十六进制数字
\0匹配一个八进制数字

反向引用和环视

元字符说明
()定义一个子表达式
\1匹配第一个子表达式;\2匹配第二个子表达式,以此类推
?=肯定式向前查看
?<=肯定式向后查看
?!否定式向前查看
?<!否定式向后查看
?()条件(if then)
?()|条件(if then else)

大小写转换

元字符说明
\E结束\L或\U转换
\l把下一个字符转换为小写
\L把后面的字符转换为小写,直到遇见\E为止
\u把下一个字符转换为大写
\U把后面的字符转换为大写,直到遇见\E为止

相关网站

  1. regex在线测试:regex101.com/
  2. regex学习网站:www.regular-expressions.info/quickstart.…