📌  相关文章
📜  最后一个字符的正则表达式特别 - Javascript(1)

📅  最后修改于: 2023-12-03 15:40:13.762000             🧑  作者: Mango

最后一个字符的正则表达式特别 - JavaScript

在正则表达式中,我们经常使用 ^ 来匹配字符串的开头,使用 $ 来匹配字符串的结尾。但是,在有些情况下,最后一个字符也需要特别对待。

$ 的特殊情况

正则表达式中,$ 一般被用来匹配字符串的结尾。但是,如果字符串的结尾是一个换行符 \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,,但不在匹配结果中包含这个字符串。