Javascript 正则表达式与数字完全匹配,而不是数字
我有一个场景,需要使用javascript查找并替换大字符串中的数字。假设我有数字2,我想用3代替它-这听起来很简单,直到我得到22,32,等等 字符串可能如下所示:Javascript 正则表达式与数字完全匹配,而不是数字,javascript,regex,Javascript,Regex,我有一个场景,需要使用javascript查找并替换大字符串中的数字。假设我有数字2,我想用3代替它-这听起来很简单,直到我得到22,32,等等 字符串可能如下所示: “注释[2]2\uu2其他文字\u2注释[32]2最终\u2222但是我的妈妈呢。” 我想把它变成这样: “注释[3]3\uu3其他文字注释[32]3最后\u2222但是我的妈妈呢。” 显然,这意味着.replace('2','3')已经不存在了,所以我去了regex。我发现在处理字符串从开始到结束的过程中,很容易获得精确匹配,即
“注释[2]2\uu2其他文字\u2注释[32]2最终\u2222但是我的妈妈呢。”
我想把它变成这样:“注释[3]3\uu3其他文字注释[32]3最后\u2222但是我的妈妈呢。”
显然,这意味着.replace('2','3')
已经不存在了,所以我去了regex。我发现在处理字符串从开始到结束的过程中,很容易获得精确匹配,即:/^2$/g
。但这不是我所拥有的。我尝试了分组、仅限数字、通配符等,但无法正确匹配
关于如何精确匹配数字的任何帮助(其中0
捕获非数字字符或与单词边界匹配的位置(\D |\b)
负前瞻确保后面的不是数字(?!\d)
(^|\D)2(?!\d) # Thanks to @Wiktor in the comments below
(?<!\d)2(?!\d) # At the time of writing works in Chrome 62+
您可以使用负前瞻: 替换为:
${1}3
如果支持向后看:
替换为:3
任务是查找(并替换)“单个”数字2,而不是嵌入到
由多个数字组成的数字
在正则表达式中,这可以表示为:
- 匹配数字
2
- 前一个字符(如果有)不能是数字
- 下一个字符(如果有)不能是数字
2
。
在其他口味的正则表达式中,例如PCRE,禁止之前的
char您可以使用负lookback,但不幸的是Javascript
regex不支持它
因此,为了避免这种情况,我们必须:
- 将捕获组放在与文本开头或其他内容匹配的位置
除数字外:
(^ |\D)
- 然后将正则表达式仅匹配2:
2
(?!\d)
所以整个正则表达式是:
(^|\D)2(?!\d)
找到这样的匹配项后,您必须将其替换为内容
第一个捕获组和3(替换数字)。它是否匹配
001
(例如:两个前导零)与一个数字精确匹配(其中0是的一个变体?可能没有查找框,(^ |\D)2(?!\D)
在这里最好。@WiktorStribiżew完全正确。我想我可以使用lookahead。但是lookahead现在可以在Chrome中工作!您不能使用(?(lookahead)在Javascript正则表达式中,因为Javascript不支持它。@Valdi_Bo旁边有一个注释。它现在在Chrome 62+中工作,目前正在成为ECMA标准的一部分。请参阅总结更改的文章。一旦两个主要浏览器实现了它,它将成为一个标准(来吧Firefox,让我们把它变成一个标准!)第一个版本的(\D |\b)2(\D |\b)
将跳过一些有效的2
,当它们仅相隔1个字符时。您至少需要环顾一下。
(^|\D)2(?!\d)