Позитивный дополнительный взгляд - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь найти три совпадения в этих строках: Фамилия, Имя и Название. Типичные линии:

  • 1SMITH / JOHNMR-AA1
  • 1SMITH / JANEMRS-AA2
  • 1SMITH / JOHNNY-AA3

Последний не имеет заголовка.

Регулярное выражение, подобное следующему, отлично подойдет для первых двух, но, конечно, не справится с последним:

^1([A-Z]+)\/([A-Z ]+)(?=MRS?)(MRS?)?-(.*)$

Регулярное выражение, подобное следующему, будет обрабатывать последнюю строку, но не первые две:

^1([A-Z]+)\/([A-Z ]+)(?=MRS?|-)(MRS?)?-(.*)$

В этом последнем случае заголовок становится частью первого имени- совпадение, так как я предполагаю, что он смотрит вперед с конца назад, чтобы найти заголовок или da sh (и da sh находится первым). Как я могу изменить шаблон так, чтобы он сначала находил заголовок вместо da sh?

1 Ответ

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

Проблема в том, что (?=MRS?)(MRS?)? фактически совпадает с (MRS?) (группа обязательна), а шаблон ([A-Z ]+) является жадным. Вы должны сделать первый необязательный (MRS?)?, а второй не жадным ([A-Z ]+?).

. Я предлагаю использовать

^1([^\/]+)\/(.*?)(MRS?)?-(.*)$

См. Демонстрационный пример regex .

Подробности

  • ^ - начало строки
  • 1 - 1 char
  • ([^\/]+) - Группа 1: любой один или несколько символов, отличных от /
  • \/ - символ / (обратите внимание, что вы можете написать его даже без экранирования, это зависит от того, как вы используете шаблон регулярного выражения)
  • (.*?) - группа 2: любые ноль или более символов, кроме символов разрыва строки, как можно меньше
  • (MRS?)? - группа 3 (необязательно): MR и необязательный S
  • - - - char
  • (.*) - Группа 4: любой ноль или более символов, кроме символов разрыва строки, как можно больше
  • $ - конец строки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...