2013-12-20 2 views
4

Я хочу сопоставить строки, которые не имеют abc, def или ghi. Противоположное легко:Regex match reverse group in javascript

/(abc|def|ghi)/ 

Как отменить это? Я не хочу

/(^abc|^def|^ghi)/ 

потому что там будет больше «логики». (Если это даже то, что он делает.)

Как отменить полное групповое совпадение (или что бы оно ни называлось)?

(я пытаюсь бить 5. по http://regex.alf.nu/)

ответ

9

Использование отрицательной lookaead:

/^(?!.*?(abc|def|ghi)).*$/ 
+0

, который собирается на практике выглядят немного тупо: это будет соответствовать (положительно) 'bobabc'. – brandonscript

+0

Почему строка начала/конца и границы слов? – Rudie

+0

Очевидно, что '^'. Не '' '. '\ B' фактически сломал его. Не должен нигде не встречаться. Теперь он работает: '^ (?!. *? (.) \ 1 \ 1)' (несоответствие было фактически 'aaa | bbb | ccc' и т. Д.). Негативный поиск трудно. – Rudie

3

Вы должны определить захвата группы, включая начало (^) и конца строки ($), или вы будете в конечном итоге с ложноположительных матчей:

/^((?!(abc|def|ghi)).)*$/ 

Это будет соответствовать:

  • боб
  • джо

Это будет не матч:

  • а
  • Защиту
  • ГХОВ
  • bobabc
  • abcjoe

в действии здесь: http://regex101.com/r/yI3tF4

+0

Я не понимаю ... Почему начало/конец? Как выглядит выражение «.» После него? Может быть, я просто не получаю neg/pos lookahead/позади .... – Rudie

+0

Ну, начало/конец есть, потому что вы хотите убедиться, что вся строка не соответствует тому, что вы отрицаете. В этом случае вы повторяете каждого персонажа, чтобы убедиться, что это не соответствует вашему условию соответствия.tl; dr: lookarounds ДЕЙСТВИТЕЛЬНО запутывают, лучше всего использовать их и не понимать их, я всегда говорю^_^Regex101 действительно дает довольно хорошее объяснение. – brandonscript

+0

Смущает. Да! Однако ваше регулярное выражение не работает. И я понятия не имею, как это работает, поэтому я не могу это исправить. Мне кажется, что '.' должно быть до взгляда, хотя, чтобы соответствовать всем символам без этого взгляда. Я пытаюсь 5. на http://regex.alf.nu/ Я получил все остальное. – Rudie

0

Использование отрицательных lookaheads:

/^(?!.*abc)(?!.*def)(?!.*ghi)/ 
/^(?!.*(abc|def|ghi))/