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

时间:2018-01-30 20:27:22

标签: javascript regex

我有一个场景,我需要使用javascript查找并替换大字符串中的数字。让我们说我的数字是2,我想用3代替它 - 这听起来很直接,直到我遇到22,32等事件。

字符串可能如下所示:
"note[2] 2 2_ someothertext_2 note[32] 2finally_2222 but how about mymomsays2."

我想把它变成这样:
"note[3] 3 3_ someothertext_3 note[32] 3finally_2222 but how about mymomsays3."

显然这意味着.replace('2','3')不在图片中,所以我去了正则表达式。当我处理字符串开始结束时,我发现很容易获得完全匹配,即:/^2$/g。但那不是我的意思。我尝试了分组,仅数字,通配符等,但我无法正确匹配。

有关如何精确匹配数字的任何帮助(其中0 <=数字&lt; = 500是可能的,但正则表达式中不需要约束)将非常感激。

3 个答案:

答案 0 :(得分:2)

See regex in use here

(\D|\b)2(?!\d)
  • (\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+

const regex = /(\D|\b)2(?!\d)/g
const str = `note[2] 2 2_ someothertext_2 note[32] 2finally_2222 but how about mymomsays2.`
const subst = "$13"

console.log(str.replace(regex, subst))

答案 1 :(得分:2)

您可以使用否定预测:

(\D|^)2(?!\d)

替换为:${1}3

如果支持后面的话:

(?<!\d)2(?!\d)

替换为:3

答案 2 :(得分:2)

任务是寻找(和替换)&#34;单身&#34;数字2,未嵌入 由多个数字组成的数字。

在正则表达式中,这可以表示为:

  • 匹配数字2
  • 以前的字符(如果有的话)不能是数字。
  • 下一个字符(如果有的话)不能是数字。

第一个条件的正则表达式很简单 - 仅2。 在其他正则表达式中,例如 PCRE ,禁止前一个 char你可以使用负面的lookbehind ,但遗憾的是Javascript 正则表达式不支持它。

因此,为了规避这一点,我们必须:

  • 将捕获组与文本开头或其他内容匹配 除了数字:(^|\D)
  • 然后将正则表达式匹配为 2 2

幸运的是,最后一个条件可以表示为负向前瞻, 因为即使是Javascript正则表达式也支持它:(?!\d)

所以整个正则表达式是:

(^|\D)2(?!\d)

找到这样的匹配后,您必须将其替换为内容 第一个捕获组和 3 (替换数字)。