// Pattern
{{\s*.*?(?!contact\.firstName|contact\.lastName|contact\.phoneNumber|contact\.language)\s*}}
// String
test {{debug}} {{contact.language}} test {{another}}
我尝试匹配{{ }}
之间不在某组字符串中的子字符串contact.firstName
,contact.lastName
,contact.phoneNumber
,{{ 1}})。现在在这个例子中,我想要排除所有文本的contact.language
恰好发生了。但不,它可以是任何文本,可能包含符号和空格。
在此示例中,我需要匹配contact.
和{{debug}}
。如果我正确理解正则表达式,它应匹配除{{another}}
下列出的内容之外的任何内容(甚至空白)。但是,它可能会因(?! )
部分而与{{contact.language}}
匹配。
如何匹配除集合中定义的内容之外的任何内容?我不是特别擅长正则表达式,因为我不是每天都在使用它。
答案 0 :(得分:1)
如果您需要使用断言来排除这些字符串,这应该可行。
# /\{\{(?!\s*contact\.(?:firstName|lastName|phoneNumber|language)\s*\}\})(?:(?!\{\{|\}\})[\S\s])+\}\}/
\{\{ # Opening brace '{{'
(?! # Assert, not any of these after open/close braces
\s*
contact\.
(?:
firstName
| lastName
| phoneNumber
| language
)
\s*
\}\}
)
(?: # Cluster
(?! \{\{ | \}\} ) # Assert not open/close braces
[\S\s] # Grab a single character
)+ # End cluster, do 1 or more times
\}\} # Closing brace '}}'
答案 1 :(得分:0)
简单而不完整的正则表达式解决方案(如果我们不能提出一个)。使用正则表达式,然后过滤它返回的数组。
功能代码:
var reg = /{{\s*.*?\s*}}/g;
var testStr = "test {{debug}} {{contact.language}} test {{another}}";
var result = testStr.match(reg).filter(function(str){
if(str === "{{contact.firstName}}" |
str === "{{contact.lastName}}" |
str === "{{contact.phoneNumber}}" |
str === "{{contact.language}}") {
return false
} else {
return true;
}
});
console.log(result);
// [ "{{debug}}", "{{another}}"]
答案 2 :(得分:0)
我相信你正试图做这样的事情:
{{((?!contact\.firstName|contact\.lastName|contact\.phoneNumber|contact\.language)[^{}])*}}
来自Regular expression to match a line that doesn't contain a word?
DEMO:https://regex101.com/r/wT6zB0/3
编辑:已更新,因此它与括号不匹配