2015-06-28 4 views
1
// Pattern 
{{\s*.*?(?!contact\.firstName|contact\.lastName|contact\.phoneNumber|contact\.language)\s*}} 

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

Я пытаюсь соответствовать подстроки, которые находятся между {{ }}, которые не являются в определенном наборе строк (contact.firstName, contact.lastName, contact.phoneNumber, contact.language). Теперь в этом примере так получилось, что текст, который я хотел исключить, имеет contact.. Но нет, это может быть любой текст и может содержать символы и пробелы.Matching подстроку, которая не содержит определенную подстроку

В этом примере мне необходимо сопоставить {{debug}} и {{another}}. Если я правильно понимаю регулярное выражение, оно должно соответствовать любому (даже пустому) значению, отличному от тех, которые перечислены ниже (?!). Тем не менее, он поддерживает соответствие {{contact.language}} возможно из-за части .*.

Как можно сопоставить что-либо иное, чем те, что определены в наборе? Я не особенно разбираюсь в регулярном выражении, поскольку я не использую его на повседневной основе.

+1

Когда '' c' в {{contact.language}} 'потребляется'. *? ',' Оставшиеся ontact.language}} 'не соответствует ни одной из' контакта \ .firstName | контакт \ .lastName | контакт \ .phoneNumber | контакт \ .language'. – Gumbo

+0

Короче говоря, вы хотите отбросить все, что начинается с 'contact.'? –

+0

@CasimiretHippolyte. Так получилось, что текст, который я хочу найти, имеет «контакт». Но это может быть что угодно, а не только «контакт». – Joseph

ответ

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

EDIT: обновление так он не соответствует скобкам

+0

Это все равно будет соответствовать '{{contact.something}}' – Joseph

+0

Ну, да. Он не включен в исключенный список, поэтому он должен совпадать. – Jan

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}}"] 
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 '}}' 
+0

Так получилось, что весь текст, который я не хотел сопоставлять, имеет 'contact.', но это может быть любой текст на самом деле. – Joseph

+0

@JosephtheDreamer - Это действительно неважно, что вы не хотите сравнивать? Я имею в виду, что описанное выше является шаблоном для размещения вашего 'stuff' в.' \ {\ {(?! (? # Stuff) \} \}) (?: (?! \ {\ {\ \} \}) [\ S \ S]) + \} \} ' – sln

Смежные вопросы