正则表达式中的【位置】的匹配规则

156 阅读2分钟

正则表达式中的位置是什么

顾名思义,正则中的位置就是两个字符中的间隔处

image.png 上图中,就存在6个可匹配的位置。

注意:对于位置,可以有多个位置字符匹配同一个位置

比如/^a$/ 和/^^^a$$$$/的含义是相同的

正则表达式中存在哪些位置

  • ^ 匹配开头位置
  • $ 匹配结尾位置
  • \b匹配单词边界位置(\w\W之间的位置)
  • \B匹配非\b的位置,也就是\b的反向匹配
  • (?=x) 匹配x字符前的位置
  • (?!x) 匹配非x字符前的位置,也就是(?=x)的反向匹配
  • (?<=x) 匹配x字符后的位置
  • (?<!x) 匹配非x字符后的位置,也就是(?<=x)的反向匹配

使用【位置】正则的案例

在特定字符前加上其他内容

"i like code".replace(/(?=like)/, "not ");
// 'i not like code'

对数据内容做逗号分隔处理

例如 1000000 变为 1,000,000

'1000000'.replace(/(?!^)(?=(\d{3})+$)/g, ',')
// '1,000,000'

看着比较复杂,其实先用语言解释就是把不是第一个的,后面带着三个数字的位置替换成','

(?!^): (?=^)匹配^之前的位置,也就是第一个字符之前的位置。所以(?!^)作为他的反向匹配,表示匹配不是第一个字符的位置(避免'100000'被替换成',100,000')

(?=(\d{3})+$): $表示末尾,所以这个位置就可以理解成,从末尾开始数三个数之前的位置。在配置/g全量匹配,就是从末尾开始数,每个三个数的位置

最终可以实现上述替换,如果不用正则,至少得写个处理函数来实现了。

限制字符串中必须有数字/字符

/(?=.*[0-9])^/.test(string)

这个也是把两个位置匹配规则写在一起,匹配同一个位置。

(?=.*[0-9])表示这个位置必须是在.*[0-9]字符串之前,也就是任意带数字的字符串之前,^表示开头。也就是说,字符串的开头位置是一个在任意包含数字的字符串之前的位置。也就是说明这个字符串中带有数字。

如果要匹配字符串中带字母也是同理实现的

/(?=.*[a-zA-Z])^/.test(string)

可以看出,在使用正则位置匹配的情况下,可以节省大量处理js的逻辑代码。后续如有遇到其他案例,也会在文中继续补充归纳。