我正在努力使用正则表达式在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
}