首页 > 解决方案 > 正则表达式解析带有转义字符的简单降价,无需后视

问题描述

注意:这必须在 JavaScript RegExp 中工作

我必须像这样解析字符串:

yo (p:abc-123-def) meets  \(p:2) \(in the cinema\) \\ (p:3) (p:4\) won't 

我需要提取的是所有(<entity>:<id>)标记,但忽略转义的东西,比如\(in the ciname\)or \\。从上面的例子中,正则表达式应该只匹配

(p:abc-123-def)
(p:3)

但不是\(p:2)\(p:4)因为括号被转义了。

现在,我仍然可以修改该标记,所以如果有更简单的方法来完成整个事情,我愿意接受建议。如果没有,我需要能够得到那些(<entity>:<id>)从正则表达式中获取这些标记。

像这样的东西

(?<!\\)\([^(?<!\\)\(]*\)

可以,但并非所有浏览器都支持后视组。

标签: javascriptregextypescript

解决方案


一种方法可能是匹配您不想要的内容并在捕获组中捕获您想要保留的内容。

例如:

\\+\([^)]+\)|\([^)]+\\+\)|(\([^:]+:[^:]+\))

正则表达式演示

  • \\+\([^)]+\)匹配 1 次以上的反斜杠,然后是一个开头(直到)
  • |或者
  • \([^)]+\\+\)匹配(到 1+ 次反斜杠和)
  • |或者
  • (捕获组
    • \([^:]+:[^:]+\)匹配(, not :, 然后:再不:)
  • )关闭捕获组

const regex = /\\+\([^)]+\)|\([^)]+\\+\)|(\([^:]+:[^:]+\))/g;
const str = `yo (p:abc-123-def) meets  \\(p:2) \\(in the cinema\\) \\\\ (p:3) (p:4\\) won't`;
let m;

while ((m = regex.exec(str)) !== null) {
  if (typeof(m[1]) != 'undefined') {
    console.log(m[1]);
  }
}


推荐阅读