Регулярное выражение для проверки имени инициала - PullRequest
0 голосов
/ 02 апреля 2020

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

INITIAL. [BLANK] INITIAL. [BLANK] INITIAL.

Может быть несколько инициалов , если за ними следует точка (.) - пробелы допускаются только между двумя инициалами (например, LB)

Не должно быть возможности использовать пробел после инициала, если нет других начальных букв.

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

([A-Z]\. (?=[A-Z]|$))+

Используя regex101, это пример: regex output

Как вы можете видеть, он по-прежнему соответствует строке, даже если в конце есть пробел, без с другим Начальным следованием.

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

Ответы [ 2 ]

1 голос
/ 02 апреля 2020

Ошибка, которую вы видите, заключается в том, что на последнем шаге ваше выражение читается как [A-Z]\. и ожидает $ (и находит его). Я бы express шаблон таким образом: (?:[A-Z]\. )*[A-Z]\.$. Обработайте последний инициал специально, потому что у него нет заключительного пробела.

1 голос
/ 02 апреля 2020

Шаблон, который вы пробовали ([A-Z]\. (?=[A-Z]|$))+, использует повторяющуюся группу захвата, которая даст вам значение последней итерации.

В этом повторении вы соответствуете пробелу <code>[A-Z]\. , фактически означая, что он должен присутствовать в матче.


Вы можете повторить 0+ раз, сопоставляя символ [AZ] с последующим пробелом для совпадения нескольких вхождений.

Тогда совпадение с символом [AZ], утверждающим, что справа, не является символом без пробелов.

\b(?:[A-Z]\. )*[A-Z]\.(?!\S)

Regex demo

Если может быть несколько пробелов, но они не должны совпадать с новой строкой:

\b(?:[A-Z]\.[^\S\r\n]*)*[A-Z]\.(?!\S)

Regex demo

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