为什么这个正则表达式替换不适用于 JavaScript,而仅适用于其他引擎?

2024-01-11

我想构建一个 JavaScript 函数,将文本转换为另一种格式,如下所示:

MATCH 1
1.  [4-17]  `public direct`
2.  [18-29] `routing.key`
MATCH 2
1.  [35-41] `direct`
2.  [42-52] `routingkey`

To this:

MATCH 1: [Group 1: public direct] [Group 2: routing.key]
MATCH 2: [Group 1: direct] [Group 2: routingkey]

我一直在使用正则表达式替换在 Chrome 浏览器控制台中弄乱这段代码,但它不会替换任何内容。这是我尝试过的方法之一,a是测试对象,问题出在第二次替换上:

a = "MATCH 1 \n\
1.  [4-17]  `public direct` \n\
2.  [18-29] `routing.key` \n\
MATCH 2 \n\
1.  [35-41] `direct` \n\
2.  [42-52] `routingkey`"

var repl = a.replace(/^(MATCH\s\d+)\s*/gm, "$1: ")
            .replace(/(\d+)\.\s+\[[^]]+\]\s*`([^`]*)`\s*/g, "[Group $1: $2]")
            .replace(/(?=MATCH\s\d+: )/g, "\n")

console.log(repl)

研究 regex101 演示,模式/(\d+)\.\s+\[[^]]+\]\s*`([^`]*)`\s*/g will 在 PHP (PCRE) 中正确替换 http://regex101.com/r/gB3uR8/1#pcre 和Python http://regex101.com/r/gB3uR8/1#python, but 不在 JavaScript 上 http://regex101.com/r/gB3uR8/1#javascript.

Why?


For PCRE http://en.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions在实现中,右方括号本身不需要转义,因为它是字符类中的第一个元字符。在 JavaScript 中,[^]代表一个有效的字符类。

正如引用自PCRE文档 http://www.pcre.org/pcre.txt:

默认情况下,右方括号本身并不特殊。然而,如果PCRE_JAVASCRIPT_COMPAT选项已设置, 单独的右方括号会导致编译时错误。如果关闭 作为类的成员需要方括号,它应该是 类中的第一个数据字符(在初始抑扬符之后,如果 存在)或用反斜杠转义。

因此,你需要转义这个角色。

/(\d+)\.\s+\[[^\]]+\]\s*`([^`]*)`\s*/g
               ^^

工作演示 https://eval.in/196171

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么这个正则表达式替换不适用于 JavaScript,而仅适用于其他引擎? 的相关文章

随机推荐