javascript - 正则表达式解析带有转义字符的简单降价,无需后视
问题描述
注意:这必须在 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>)
从正则表达式中获取这些标记。
像这样的东西
(?<!\\)\([^(?<!\\)\(]*\)
可以,但并非所有浏览器都支持后视组。
解决方案
一种方法可能是匹配您不想要的内容并在捕获组中捕获您想要保留的内容。
例如:
\\+\([^)]+\)|\([^)]+\\+\)|(\([^:]+:[^:]+\))
\\+\([^)]+\)
匹配 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]);
}
}
推荐阅读
- scala - 如何使用数据时间格式化程序将 2020 年 7 月转换为 2020 年 7 月?
- python - 我试图制作一个启动两个 .exe 文件的应用程序,但我也想让它在任何计算机上运行,最好是一个大的 .exe 文件
- python - 从 total 中提取值 505 ,文件无法加载为 json 文件
- angular - 如何获取以角度传递给路由器链接的数据?
- javascript - 使用字符串字母顺序的jQuery排序数组
- python - 在抓取的 href 链接之前添加“https:”?
- ruby-on-rails - 从活动记录查询中选择 * 而不是 table.*
- php - 如何在不编辑核心文件的情况下修改 woocommerce 包含文件?或者有没有办法将包含文件复制到子主题?
- php - 如何在 CentOS 7 上从 PHP 7.x 更新到 PHP 7.4
- arrays - 如何获取不在MongoDB聚合管道中另一个数组中的数组元素?