正则表达式中的位置是什么
顾名思义,正则中的位置就是两个字符中的间隔处
上图中,就存在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的逻辑代码。后续如有遇到其他案例,也会在文中继续补充归纳。