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

到目前为止,我已经尝试过类似__\s*(['"])([^']+)\1的方法,但它不适用于第二个示例。

我实际上正在尝试做[^\1]之类的事情来匹配所有但第一个后向引用,但这是行不通的。

最佳答案

您可以使用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
}

10-07 19:50