Как мне расставить приоритеты в моем состоянии «ИЛИ» в регулярных выражениях. Я довольно новичок в кодировании - PullRequest
0 голосов
/ 20 апреля 2020

В двух случаях может потребоваться захват данных.

  1. Поступает тестовая строка
  2. тестовая строка

Я хочу захватить только «это тестовая строка».

Регулярное выражение, которое я написал:

((?<=Incoming)(?:\s+[A-Za-z-]+)+)|(?:[A-Za-z-]+\s+)

Регулярно работает без условия OR для оператора prob 1. Но как только я добавляю условие ИЛИ, вся строка «1» захватывается вместо «это тестовая строка».

Есть ли какой-нибудь приоритет для первой части регулярного выражения? Как я хочу, чтобы первое регулярное выражение проверялось первым, а если совпадений нет, go - второму регулярному выражению.

Спасибо

1 Ответ

0 голосов
/ 20 апреля 2020

Если вы используете только первую часть, матч может начаться только после встречи с Incoming слева. Если вы добавите чередование, вторая часть может и будет соответствовать первому слову.

Если вы не хотите совпадать с Incoming, но хотите сопоставить все остальные слова, вы можете использовать отрицательный прогноз .

Обратите внимание, что \s также может соответствовать новой строке, поэтому я использовал пробел в демо.

(?<!\S)(?!Incoming\s)[A-Za-z-]+(?:\s+(?!Incoming)[A-Za-z-]+)*

Объяснение

  • (?<!\S) Утверждение пропусковой границы слева
  • (?!Incoming\s) Утверждение того, что непосредственно справа, не является входящим и пробельным символом
  • [A-Za-z-]+ Совпадение 1+ раз за символ A-Za-z или -
  • (?: Группа без захвата
    • \s+(?!Incoming) Подберите 1+ пробельных символов и проверьте, что справа не является Входящий
  • [A-Za-z-]+ Совпадение 1+ раз за символ A-Za-z или -
  • )* Закрыть группу и повторить 1+ раз

Regex demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...