为什么这个正则表达式替换在JavaScript中不起作用,只在其他引擎中起作用?

5
我希望构建一个JavaScript函数,将文本转换为另一种格式,例如:
MATCH 1
1.  [4-17]  `public direct`
2.  [18-29] `routing.key`
MATCH 2
1.  [35-41] `direct`
2.  [42-52] `routingkey`

到这个:
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可以在PHP(PCRE)中正确替换 和Python, 但不能在JavaScript中使用

为什么?


2
你必须在字符类中转义 ],因为在 JavaScript 中 [^] 表示所有字符。 - walid toumi
1个回答

4
对于 PCRE实现来说,由于它是字符类中的第一个元字符,因此独立的闭方括号无需转义。在JavaScript中,[^]表示有效的字符类。
引用自 PCRE文档
“默认情况下,独立的闭方括号并不特殊。但是,如果设置了PCRE_JAVASCRIPT_COMPAT选项,则孤立的闭方括号会导致编译时错误。如果需要作为类成员的闭方括号,它应该是类中的第一个数据字符(如果存在初始插入符号,则在其后)或通过反斜杠进行转义。”
因此,您需要转义这个字符。
/(\d+)\.\s+\[[^\]]+\]\s*`([^`]*)`\s*/g
               ^^

工作演示


@vks:因为在JavaScript中[^]是一个有效的字符类,但在Python或PCRE中不是。 - Amal Murali
我已经请求修复regex101中[^]的解释,现在已经[status-completed]。谢谢! - Unihedron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接