通过 new RegExp(myString) 创建的正则表达式不起作用(反斜杠)

IT技术 javascript regex
2021-01-17 03:44:47

所以,我正在尝试编写一个匹配所有数字的正则表达式。这是正则表达式:

/\b[\d \.]+\b/g

我尝试在字符串上使用它:

100 two 100

一切正常;它匹配两个数字。

但我想以以下形式重写正则表达式:

new RegExp(pattern,modifiers)

因为我觉得它看起来更清晰。所以我这样写:

new RegExp('\b[\d \.]+\b','g')

但现在它不会匹配以前的测试字符串。我已经尝试了一切,但我就是无法让它工作。我究竟做错了什么?

1个回答

您的问题是字符串中的反斜杠具有特殊含义;如果您想在正则表达式中使用反斜杠,则首先需要在传递给正则表达式的字符串中获取文字反斜杠:

new RegExp('\\b[\\d \\.]+\\b','g');

请注意,这是一个非常糟糕(允许)的正则表达式,因为它将匹配". . . "为“数字”或"1 1...3 42". 更好的可能是:

/-?\d+(?:\.\d+)?\b/

在此处输入图片说明

请注意,这匹配奇怪的东西,例如0000.3也不匹配:

  • 领导 +
  • 科学记数法,例如 1.3e7
  • 缺少前导数字,例如 .4

另外,请注意,与使用 RegExp 文字相比,使用 RegExp 构造函数(略微)更慢,当然也不那么惯用。当您需要从提供的字符串构造您的 RegExp 时,使用它只是一个好主意。大多数熟悉 JavaScript 的人都会发现这个/.../符号非常清楚。

值得一提的是,您可以使用new RegExp(String.raw`\b[\d \.]+\b`, "g")而不是手动转义每个特殊字符。注意 String.raw 后面的反引号而不是引号。
2021-04-09 03:44:47