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

时间:2014-09-20 15:27:23

标签: javascript regex

我想构建一个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*/greplace properly in PHP (PCRE) and Python,但not on JavaScript

为什么?

1 个答案:

答案 0 :(得分:4)

对于PCRE实现,由于它是字符类中的第一个元字符,因此不需要转义结束方括号。在JavaScript中,[^]表示有效的字符类。

引自PCRE documentation

  

默认情况下,关闭方括号本身并不特殊。但是,如果设置了 PCRE_JAVASCRIPT_COMPAT 选项,          单独的右方括号会导致编译时错误。如果结束          方括号是作为班级成员所必需的,应该是          类中的第一个数据字符(在最初的抑扬之后,如果          用反斜杠逃脱。

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

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

Working Demo