在JS中匹配每个字符但反向引用

时间:2016-03-09 16:43:23

标签: javascript regex backreference

我正在努力使用正则表达式来捕捉Anything__ 'Anything'中的__ "Anything"

到目前为止,我已经尝试了类似__\s*(['"])([^']+)\1的内容,但它不会使用第二个示例。

我实际上尝试做[^\1]之类的事情以匹配所有内容但是第一个反向引用,但这不会起作用。

1 个答案:

答案 0 :(得分:3)

您可以使用tempered greedy token来模拟带有多字符替代的否定字符类:

__\s*(['"])((?:(?!\1).)*)\1
            ^^^^^^^^^^^^

请参阅regex demo

如果引号之间可以有换行符,请将.替换为[\s\S]

__\s*(['"])((?:(?!\1)[\s\S])*)\1

这是一个工作片段:

var re = /__\s*(['"])((?:(?!\1).)*)\1/g; 
var str = '__ \'Anything1\' and in __ "Anything2"';

while ((m = re.exec(str)) !== null) {
   document.body.innerHTML += m[2] + "<br/>"; // demo
}

根据Sebastian Proske的评论,当然可以在这里使用替换:

__\s*(?:'([^']*)'|"([^"]*)")

只是值将在不同的组中,并且仍会存在回溯。

var re = /__\s*(?:'([^']*)'|"([^"]*)")/g; 
var str = '__ \'Anything1\' and in __ "Anything2"';
while ((m = re.exec(str)) !== null) {
  document.body.innerHTML += (m[2] ? m[2] : m[1]) + "<br/>"; // demo
}