Регулярное выражение для соответствия всему, кроме заданных слов (которые могут включать дефисы / тире)

#regex

#регулярное выражение

Вопрос:

Я хотел бы сопоставить все, кроме заданных слов, поэтому, учитывая этот список:

 wordOne
wordTwo/xy/z
word-three
word-four/lots/of/stuff
  

Я мог бы использовать это регулярное выражение для сопоставления всего, кроме wordOne:

 (?!wordOne)b. 
  ==>
    wordTwo/xy/z
    word-three
    word-four/lots/of/stuff   
  

Однако, если я хочу сопоставить все, кроме одного из слов, содержащих дефис / тире, то одно и то же регулярное выражение не работает, потому что дефис не является частью границы слова, которая является [a-zA-Z0-9_]

Например

 some-regexp(word-four)
  ==>
    wordOne
    wordTwo/xy/z
    word-three
  

И

 some-regexp(word-four and word-three)
  ==>
    wordOne
    wordTwo/xy/z
  

Ответ №1:

Как я вижу, вы определяете по одному слову в строке в своих примерах. В этом случае это регулярное выражение должно работать для вас:

 ^(?:(?!word-four|word-three).)*$
  

оно пропускает слова, содержащие word-four или word-three .

Согласно вашим примерам:

 ^(?:(?!wordOne).)*$
  ==>
    wordTwo/xy/z
    word-three
    word-four/lots/of/stuff 

^(?:(?!word-four).)*$
  ==>
    wordTwo/xy/z
    word-three
    word-four/lots/of/stuff 

^(?:(?!word-four|word-three).)*$
  ==>
    wordOne
    wordTwo/xy/z
  

Смотрите это на rubular.