首页 > 解决方案 > 如何使用Javascript检查正则表达式中的奇数个反斜杠?

问题描述

我最近问了一个关于我在 Javascript 中使用带有后向断言的 RegExp 构造函数时遇到的错误的问题。

我想做的是检查大于 5 的数字输入,前面有一个奇数个反斜杠,换句话说,前面没有转义的反斜杠

这是一个例子。

\5              // match !
\\5            // no match !
\\\5           // match!

我在网上找到的正则表达式是

(?<!\\)(?:\\{2})*\\(?!\\)([5-9]|[1-9]\d)

但这里的问题是(?<!\\)导致 javascript 抛出错误无效正则表达式组的问题。

有解决方法吗?

最后,我知道我当前的正则表达式在检测大于 5 的数字时也可能存在错误,例如 \55 将不匹配。我会很感激你的帮助。

谢谢你

标签: javascriptregexlookbehind

解决方案


JS 不支持lookbehinds(至少不是所有主要浏览器都支持),因此会出现错误。你可以试试:

(?:^|[^\\\n])\\(?:\\{2})*(?![0-4]\b)\d+

或者,如果您关心十进制数:

(?:^|[^\\\n])\\(?:\\{2})*(?![0-4](?:\.\d*)?\b)\d+(?:\.\d*)?

现场演示

注意:\n如果您没有多行文本,则不需要。

正则表达式分解

  • (?:非捕获组的开始
    • ^线的开始
    • |或者
    • [^\\\n]只匹配反斜杠
  • )非捕获组结束
  • \\(?:\\{2})*匹配偶数个反斜杠
  • (?![0-4](?:\.\d*)?\b)以下数字不应小于5(关心十进制数字)
  • \d+(?:\.\d*)?匹配一个数字

JS代码:

var str = `\\5
\\\\5
\\\\\\5
\\\\\\4
\\4.
\\\\\\6
`;

console.log(
  str.match(/(?:^|[^\\\n])\\(?:\\{2})*(?![0-4](?:\.\d*)?\b)\d+(?:\.\d*)?/gm)
)


推荐阅读