📅  最后修改于: 2023-12-03 15:40:13.762000             🧑  作者: Mango
在正则表达式中,我们经常使用 ^
来匹配字符串的开头,使用 $
来匹配字符串的结尾。但是,在有些情况下,最后一个字符也需要特别对待。
$
的特殊情况正则表达式中,$
一般被用来匹配字符串的结尾。但是,如果字符串的结尾是一个换行符 \n
,$
就无法匹配到。这是因为 $
只匹配字符串的结尾,而不匹配任何额外的字符。
如果想要匹配换行符或者其他特殊字符的结尾,可以使用 $
的另一个特殊形式,\n?$
。这个正则表达式会先匹配字符串结尾的 n
字符,如果没有则匹配其他字符的结尾。这样就可以匹配到结尾处的换行符了。
const text = 'hello\n';
text.match(/\n?$/); // => ["\n"]
text.match(/$/); // => [""]
在使用正则表达式匹配字符串时,有时不想捕获最后一个字符。这个时候,可以使用非捕获组 (?:)
。非捕获组与普通的捕获组 ( )
类似,但是不会把匹配到的结果保存到捕获组中。
const text = 'hello, world!';
text.match(/.+([^,])/); // => ["hello, world!", "d"]
text.match(/.+(?:[^,])/); // => ["hello, world!"]
在上面的例子中,第一个正则表达式会把最后一个字母匹配到一个捕获组中。第二个正则表达式使用了非捕获组,不会将结果保存到捕获组中。
反向引用是指,在正则表达式中使用 ()
捕获组并将结果存储到内存中,然后在表达式中使用 \数字
来引用这些结果。这种技术非常有用,可以用来匹配重复的字符、匹配对称的字符串等等。
假设我们想匹配符合以下两个条件的字符串:
我们可以使用正则表达式 /(\d)(?=\d*$)(?=.*\1)/
。
(\d)
:用于捕获字符串中的数字。(?=\d*$)
:用于匹配数字后面的所有字符,这个位置后面的数字才是最后一个数字。(?=.*\1)
:用于匹配字符串中前面出现过的数字,这个数字必须与第一个括号里面捕获到的数字相等。const text = 'abcdefg123';
text.match(/(\d)(?=\d*$)(?=.*\1)/); // => ["3", "3"]
这个正则表达式将会把字符串中最后一个数字 3 捕获到一个括号里面,并且利用反向引用来判断这个数字是否与之前出现过的数字相等。
后置断言是正则表达式的一种高级特性,它允许我们匹配在某个字符串之后的内容,但不在实际的匹配结果中包含这个字符串。
const text = 'hello,world';
const regex = /(?<=hello,).*/;
text.match(regex); // => ["world"]
在上面的例子中,正则表达式 /(?<=hello,).*/
匹配以 hello,
开头的字符串中除 hello,
以外的部分。我们使用了后置断言 (?<=hello,)
来匹配 hello,
,但不在匹配结果中包含这个字符串。