Сопоставить все, кроме определенной фразы

#regex #regular-language

#регулярное выражение #обычный язык

Вопрос:

Я нашел множество вопросов, касающихся «сопоставления всех слов, кроме одного слова в строке». Однако ни один из них не работает в случае фразы (два или более слов вместе взятых). Предположим, у меня есть строка, как в примере (регулярное выражение). Я хочу сопоставить все возможные комбинации из одного слова 10-значный номер, за исключением определенной комбинации / фразы «nip 10-значный номер» ( означает простой пробел). В моем примере я использую bnips*d{10}b для сопоставления «nip 10-значный номер», но я хочу сопоставить все, кроме «nip 10-значный номер». hello также не должно совпадать из-за отсутствия 10-значного номера с правой стороны. Буду признателен за любую помощь.
Пример:

    hello 
   alpha 1111111111 # should be matched
   allla 2322322321 # should be matched
   nip 5260305006 
   pin 5260305006 # should be matched
   nipp 5260305006 # should be matched
 

Комментарии:

1.Нравится это? b(?!nipb)S s*d{10}b regex101.com/r/dJwTrJ/1

2. Спасибо, это решение, которое я искал. Я использовал b(?!nip)s*d{10}b , но это не сработало. Не могли бы вы объяснить, для чего вы S добавляете?

3. Он сопоставляет 1 или более символов без пробелов, прежде чем сопоставлять необязательные символы с пробелами. Я добавил его в качестве ответа с объяснением.

Ответ №1:

Вы можете использовать

  b(?!nipb)S s*d{10}b
 

Объяснение

  • b(?!nipb) Граница слова, утверждает, что то, что находится прямо справа, не nip является границей слова
  • S s* Сопоставьте 1 символы без пробелов, за которыми следуют необязательные символы с пробелами (или используйте w вместо S , чтобы сопоставлять только символы слов)
  • d{10}b Сопоставьте 10 цифр, за которыми следует граница слова

Демонстрация регулярных выражений

Если вы хотите want to match all possible combination of a single word 10-digits и не хотите сопоставлять nip 10-digits number" ( means a simple space) , вы можете исключить это из сопоставления, включая пробел и 10 цифр.

Обратите внимание, что это соответствует nip5260305006 , поскольку между ними нет пробела.

 b(?!nip d{10}b)S s*d{10}b
 

Демонстрация регулярных выражений