Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正则表达式与数字完全匹配,而不是数字_Javascript_Regex - Fatal编程技术网

Javascript 正则表达式与数字完全匹配,而不是数字

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。我发现在处理字符串从开始到结束的过程中,很容易获得精确匹配,即

我有一个场景,需要使用javascript查找并替换大字符串中的数字。假设我有数字2,我想用3代替它-这听起来很简单,直到我得到22,32,等等

字符串可能如下所示:
“注释[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
幸运的是,最后一个条件可以表示为负前瞻, 因为即使Javascript正则表达式也支持它:
(?!\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)