匹配不包含某个子字符串的子字符串

时间:2015-06-28 19:35:09

标签: javascript regex string replace

// Pattern
{{\s*.*?(?!contact\.firstName|contact\.lastName|contact\.phoneNumber|contact\.language)\s*}}

// String
test {{debug}} {{contact.language}} test {{another}}

我尝试匹配{{ }}之间不在某组字符串中的子字符串contact.firstNamecontact.lastNamecontact.phoneNumber,{{ 1}})。现在在这个例子中,我想要排除所有文本的contact.language恰好发生了。但不,它可以是任何文本,可能包含符号和空格。

在此示例中,我需要匹配contact.{{debug}}。如果我正确理解正则表达式,它应匹配除{{another}}下列出的内容之外的任何内容(甚至空白)。但是,它可能会因(?! )部分而与{{contact.language}}匹配。

如何匹配除集合中定义的内容之外的任何内容?我不是特别擅长正则表达式,因为我不是每天都在使用它。

3 个答案:

答案 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

编辑:已更新,因此它与括号不匹配