JS RegExp¶
约 1226 个字 1 行代码 预计阅读时间 4 分钟
RegExp 对象¶
-
正则表达式是一种字符模式。
-
该模式用于对文本进行模式匹配的“搜索和替换”功能。
-
在 JavaScript 中,RegExp 对象是一种拥有属性和方法的模式。
修饰符¶
修饰符 | 描述 |
---|---|
i | 执行对大小写不敏感的匹配。 |
g | 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。 |
m | 执行多行匹配。 |
模式¶
- 括号用于查找一定范围的字符串:
表达式 | 描述 |
---|---|
[abc] | 查找方括号之间的任何字符。 |
[^abc] | 查找任何不在方括号之间的字符。 |
[0-9] | 查找任何从 0 至 9 的数字。 |
[^0-9] | 查找任何不在括号内的字符(任何非数字)。 |
(x | y) |
- 元字符(Metacharacter)是拥有特殊含义的字符:
元字符 | 描述 |
---|---|
. | 查找单个字符,除了换行符或行终止符。 |
\w | 查找单词字符。 |
\W | 查找非单词字符。 |
\d | 查找数字。 |
\D | 查找非数字字符。 |
\s | 查找空白字符。 |
\S | 查找非空白字符。 |
\b | 在单词的开头/结尾查找匹配项,开头如下:\bHI,结尾如下:HI\b。 |
\B | 查找匹配项,但不在单词的开头/结尾处。 |
\0 | 查找 NULL 字符。 |
\n | 查找换行符。 |
\f | 查找换页符。 |
\r | 查找回车符。 |
\t | 查找制表符。 |
\v | 查找垂直制表符。 |
\xxx | 查找以八进制数 xxx 规定的字符。 |
\xdd | 查找以十六进制数 dd 规定的字符。 |
\uxxxx | 查找以十六进制数 xxxx 规定的 Unicode 字符。 |
量词 | 描述 |
---|---|
n+ | 匹配任何包含至少一个 n 的字符串。 |
n* | 匹配任何包含零个或多个 n 的字符串。 |
n? | 匹配任何包含零个或一个 n 的字符串。 |
n{X} | 匹配包含 X 个 n 的序列的字符串。 |
n{X,Y} | 匹配包含 X 至 Y 个 n 的序列的字符串。 |
n{X,} | 匹配包含至少 X 个 n 的序列的字符串。 |
n$ | 匹配任何以 n 结尾的字符串。 |
^n | 匹配任何以 n 开头的字符串。 |
?=n | 匹配任何其后紧接指定字符串 n 的字符串。 |
?!n | 匹配任何其后没有紧接指定字符串 n 的字符串。 |
分组¶
- 我们可以对一个表达式进行分组,并用这些分组来引用或执行一些规则。为了给表达式分组,我们需要将文本包裹在
()
中
ha-ha,haa-haa
/(haa)/g
ha-ha,haa-haa
- 引用组:用 \1 来避免重复书写。这里的 1 表示分组的顺序。
ha-ha,haa-haa
/(ha)-\1,(haa)-\2/g
ha-ha,haa-haa
- 可以对表达式进行分组,并使用
(?:)
确保它不被引用捕获。例如,下面有两个分组,但我们用\1
引用的第一个组实际上是指向第二个组,因为第一个是未被捕获的分组。
ha-ha,haa-haa
/(?:ha)-ha,(haa)-\1/g
ha-ha,haa-haa
零宽断言¶
-
零宽断言(Lookarounds):如果我们希望正在写的词语出现在另一个词语之前或之后,我们需要使用「零宽断言」。
-
例如,我们要匹配文本中的小时值。为了只匹配后面有
PM
的数值,我们需要在表达式后面使用正向先行断言(?=)
,并在括号内的=
后面添加PM
。
Data: 4 Aug 3PM
/\d+(?=PM)/g
Data: 4 Aug 3PM
- 例如,我们要在文本中匹配除小时值以外的数字。我们需要在表达式后面使用负向先行断言
(?!)
,并在括号内的!
后面添加PM
,从而只匹配没有PM
的数值。
Data: 4 Aug 3PM
/\d+(?!PM)/g
Data: 4 Aug 3PM
- 例如,我们要匹配文本中的金额数。为了只匹配前面带有
$
的数字。我们要在表达式前面使用正向后行断言(?<=)
,并在括号内的=
后面添加\$
。
Product Code: 1064 Price: $5
/(?<=\$)\d+/g
Product Code: 1064 Price: $5
- 例如,我们要在文本中匹配除价格外的数字。为了只匹配前面没有
$
的数字,我们要在表达式前用负向后行断言(?<!)
,并在括号内的! 后面添加
$`。
Product Code: 1064 Price: $5
/(?<!\$)\d+/g
Product Code: 1064 Price: $5
贪婪&懒惰匹配¶
- 正则表达式默认执行贪婪匹配。这意味着匹配内容会尽可能长。如下面的示例,它匹配任何以
r
结尾的字符串,以及前面带有该字符串的文本,但它不会在第一个r
处停止匹配。
ber beer beeer beeeer
/.*r/
ber beer beeer beeeer
- 与贪婪匹配不同,懒惰匹配在第一次匹配时停止。下面的例子中,在
*
之后添加?
,将查找以r
结尾且前面带有任意字符的第一个匹配项。这意味着本次匹配将会在第一个字母r
处停止。
ber beer beeer beeeer
/.*?r/
ber beer beeer beeeer