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

Why does this regex replacement not work for JavaScript, but instead only work for other engines?

本文关键字:适用于 其他 引擎 JavaScript 为什么 正则表达式 替换 不适用      更新时间:2023-09-26

我想构建一个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浏览器控制台中使用regex替换来处理这段代码,但它不会替换任何内容。这是我尝试过的一种方法,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中不会。

为什么?

对于PCRE实现,由于闭合方括号是字符类中的第一个元字符,因此不需要对其本身进行转义。在JavaScript中,[^]表示一个有效的字符类。

引用自PCRE文件:

默认情况下,方括号本身并不特殊。但是,如果设置了PCRE_JAVASCRIPT_COMPAT选项,一个单独的闭合方括号会导致编译时错误。如果关闭方括号是类的成员,它应该是类中的第一个数据字符(如果present)或用反斜杠转义。

因此,你需要逃离这个角色。

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

工作演示

相关文章: