所有内容都是基于参考内容: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"
前后查找
场景:包含的匹配本身并不返回,而是为了确定真正要匹配内容的位置,并不是匹配结果的一部分。
==*== 向前查找,基本都支持,像后查找不一定支持。