正则表达式

92

所有内容都是基于参考内容:1.正则表达式必知必会 2.菜鸟笔记中正则相关部分

正则表达式【regex】

精简化的进行信息 搜索替换 的字符串。

修饰符

g 全局匹配

正则匹配绝大数情况下,只会返回第一个匹配结果,通过 g 修饰符则可以返回符合的全部匹配结果。

例如:/a/g

i 不区分大小写

正则表达式式区分大小写的,可以通过 i 修饰符则可指定搜索不区分大小写。

例如:/abc/i 则abc,Abc ... 都可以匹配

元字符

在正则中有特殊含义的字符;不作为元字符使用时,必须转义。

. 匹配除换行符 \n 之外的任何单字符

. 相当于 Dos? 字符,SQL 中的_ (下划线) 字符;在一个正则表达式中可以使用多次。

\ 转义,使特殊字符能匹配其本身

要搜索 \ 本身也需要进行转义: \\ ,作为转义字符使用要接特殊字符。

==*== () 英文模式下是特殊字符,中文模式下不是特殊字符;如果运用了转义,代码在进行压缩的情况下,会将中文转化为Unicode 码 : () -> \uff08\uff09

这个场景下,错误大的使用 \ 会导致本地代码和服务器上代码的运行差异。

[] 字符集:中间的所有字符都是该集合的组成,可以和集合中任意一个成员匹配

例如:[abc] 可以匹配 plain 中的 a。

- 连字符,简化字符区间定义

在用到一些字符区间(例如:0~9,A~Z,a~z)时,就可以用到 - 表达,例如 [0-9][A-Z]

在一个字符集中可以使用多个字符区间,例如 [A-Za-z0-9] 可以匹配任意字母(无论大小写)或者数字。

  • 连字符是特殊元字符,只在字符集 [] 中作为元字符,其他地方都是普通字符。
  • 在定义字符区间时,需注意不能尾字符小于首字符 例如:[3-1] ;是无意义的,且会让匹配失效。
  • 匹配其他字符时,会匹配对应ASCII字符区间的字符,所以除了通用的,其他情况并不能想当然使用。例如匹配 A-z 的话还会包含 [ ^

^ 使用在字符集中并且紧贴 [ 代表非,作用于整个字符集结果。

字符集使用,例如 :[^a] 匹配非a的字符。

| 或字符

会将字符左右二边作为二部分,二部分都作为一个整体,满足二部分任一,都可以匹配到。

==*==使用的时候注意 19|20\d{2}(19|20)\d{2} 匹配起来是不一样的,注意或字符的作用区间。

空白字符

元字符说明
\b匹配单词边界,单词和空格间的位置。例如: er\b 可以匹配 never ,但是无法匹配 verb
\f换页符,等价于 \x0c 和 \cL。
\n换行符,等价于 \x0a 和 \cJ。
\r回车符,等价于 \x0d 和 \cM。
\t制表符(Tab键),等价于 \x09 和 \cI。
\v垂直制表符,等价于 \x0b 和 \cK。

\r\n 是 Windows 所使用的文本行结束标签,Unix 和 Linux 系统只使用一个换行符来结束一个文本行。

类元字符,可以替代一些常用字符集的特殊元字符

元字符说明
\d任一数字字符。等价于 [0-9]
\D\d 匹配的内容
\w字母(大小写均可),数字,下划线 等价于 [A-Za-z0-9_]
\W\w 匹配的内容
\s任一空白字符等价于 [ \f\n\r\t\v] (退格字符\b是特例,不在覆盖范围内)
\S\s 匹配的内容

重复匹配

元字符说明
+匹配前面的子表达式一次或多次, 等价于 {1,}。
*匹配前面的子表达式零次或多次, 等价于 {0,}。
?匹配前面的子表达式零次或一次, 等价于 {0,1}。

注意匹配字符集需放在字符集外,例如 [0-9]+ ,写在字符集内将作为普通字符被匹配。

重复次数 {}

元字符说明
{n}n非负整数,匹配确定的次数。
{n,}n非负整数,至少匹配n次。
{n,m}n,m非负整数,其中n <= m,匹配n-m之间的次数。

防止过度匹配

有些元字符例如:*+ 是贪婪型元字符,匹配模式属于多多益善,在匹配范围内会尽可能匹配更多的内容(匹配达到最后一个匹配为止),而不是遇到第一个匹配时为止。

在仅需要匹配到第一个时,我们需要通过追加 ? 解除。

例如:*?+?{n,}?

位置匹配

元字符说明
\b单词边界,可以理解为单词和非单词之间的位置。要匹配完整单词必须前后都加上 \b 限定。==只匹配位置,不匹配任何字符==
\B非单词边界,例如 \B-\B 可以匹配 color - coded 而不会匹配 nine-digit
用于定义字符串开头
$用于定义字符串结尾

大小写转换

元字符说明
\E结束\L或\U的转换,可以理解为结束标识
\l把下一个字符转换为小写
\L把和\E之间的内容全部转换为小写
\u把下一个字符转换为大写
\U把和\E之间的内容全部转换为大写

分行匹配 (?m)

可以通过使用 (?m) 改变位置匹配元字符的匹配逻辑(==注意 (?m) 需写在最前==),^$ 将不止能匹配开头结尾,还可以匹配换行符后的开头和结尾位置。

例如可以通过 (?m)^\s*//.*$ 去匹配代码注释内容。

==*==并不是所有正则表达式都支持 (?m)

正则表达式里,十六进制 前缀为 \x八进制 前缀为 \0 ;js中不支持 POSIX 字符类。

子表达式

通过 () 将部分表达式作为一个独立元素使用,作为表达式的子表达式,子表达式支持嵌套使用。

回溯引用:正则表达式引用前面匹配的结果,==需配合子表达式使用==

回溯引用通常从1开始计数,0一般代表整个正则表达式

==*==不同编程语言对回溯语法的支持实现并不相同,具体使用看对应编程语言的支持。

  • 查找: \n (n为数字,代指第n个表达式值)

    例如:<([hH][1-6])>.*?</\1> , 可以匹配多级标题标签。

  • 替换: $n

    例如:"xxx url地址 xxxxx".replace(/(url地址)/,"<a>$1</a>") 得到 "xxx <a>url地址</a> xxxxx"

前后查找

场景:包含的匹配本身并不返回,而是为了确定真正要匹配内容的位置,并不是匹配结果的一部分。

==*== 向前查找,基本都支持,像后查找不一定支持。