Regex сопоставляет эти слова, но исключает совпадения с этими

1

Я ищу выражение регулярных выражений для выполнения нескольких строк и соответствия этим словам в них:

Maces Armour Evasion Shields

Исключая строки, содержащие эти слова:

Swords Axes Staves

Например (эти две строки - одна строка):

12% Increased Physical Damage with Maces
8% Increased Armour

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

10% Increased Evasion
8% Increased Attack Speed with Swords

Как я могу исключить этот список?

  • 0
    почему 10% Increased Evasion не совпадает?
  • 0
    @user3218114 user3218114 Эти две строки являются полной строкой
Показать ещё 1 комментарий
Теги:

2 ответа

4
Лучший ответ

Вы можете использовать lookahead для нужных слов и отрицательный взгляд на запрещенные слова (если ваш механизм регулярных выражений допускает эти две функции):

(?s)(?=.*\b(?:Maces|Armour|Evasion|Shields)\b)(?!.*\b(?:Swords|Axes|Staves)\b)^.+$
  • 0
    @Unihedron: Вы не можете избежать возврата, даже если вы ставите якорь в начале, это ничего не меняет.
  • 0
    @Unihedron: атомарные группы здесь не нужны, поскольку группы не содержат квантификаторов или если у вас установлены слова такого типа: abcd|abc|defgh|def . Тем не менее, ваш путь тоже работает хорошо.
Показать ещё 1 комментарий
3

Вы можете использовать singleline регулярное выражение:

/^(?=.*(?>Maces|Armour|Evasion|Shields))(?!.*(?>Swords|Axes|Staves)).+$/s
  • (?=.*(?>Maces|Armour|Evasion|Shields)) Утверждает, что одно из этих слов присутствует в строке [no backtracking]
  • (?!.*(?>Swords|Axes|Staves)) утверждает, что ни одно из этих слов не присутствует в строке [no backtracking]

Вот демо-версия regex !

Ещё вопросы

Сообщество Overcoder
Наверх
Меню