Я не думаю, что есть способ достичь этого в одном регулярном выражении. Вместо этого я предлагаю использовать концепцию белого и черного списков.
Как уже упоминалось, \w
эквивалентно [A-Za-z0-9_]
. Вы также можете сопоставить границу слова (\b
) вместо начала и конца строки.
Белый / черный список может быть отдельной строкой или регулярным выражением, в зависимости от ваших требований.
псевдокод:
if regex(string, pattern = whitelist) and string != blacklist
Обратите внимание, что если регулярное выражение не совпадает, оно закоротит , поэтому не будет проверять, совпадает ли черный список. Если вы ожидаете, что черный список будет совпадать чаще, чем белый, вы захотите поменять их местами.
Редактировать: Если вы соответствуете по одному слову в строке, отрицательный прогноз работает. Похоже, что вы делали в своем выражении, так что не обращайте на это внимания.