Ошибка соответствия с регулярным выражением - PullRequest
0 голосов
/ 02 марта 2019

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

  1. слово состоит только из букв, цифр, апострофов, дефисов и подчеркиваний

  2. начинаются с буквы или апострофа, за которыми следует буква

  3. , не содержат последовательности из 2 или более апострофов, подчеркиваний или дефисов
  4. и заканчиваются буквой, цифрой или апострофомперед буквой s или апострофом, за которым следует s

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

Для правила 2 я построил

^[']?[a-zA-Z][a-zA-Z0-9]+

ДляПравило 3, которое я построил

(?!.*[-_'][-_'])(?=[a-z])[a-zA-Z0-9]* 

, но для тестовой строки abc def''ghi оно соответствует ghi, а не abc

Для правила 4, которое я построил

.*[a-zA-Z0-9](?:'s)?(?:s')?$

но для тестовой строки test's abc' она не совпадает ни с чем, но должна соответствовать test's

Я ищу совет для правила 3 ​​и 4 о том, как улучшить мойрегулярное выражение, чтобы они работали

1 Ответ

0 голосов
/ 02 марта 2019
(?:^|\s)\K(?!'')['a-z](?:['_-]?[a-z0-9])+['_-]?(?:(?<!')'s|s'|[a-z])(?=\s|$)

Объяснение:

(?:^|\s)            # non capture group, beginning of line OR space
\K                  # forget all we've seen until this position
(?!'')              # negative lookahead, not two apos.
['a-z]              # apos. or letter
(?:                 # start non capture group
    ['_-]?          # apos, dash or underscore, optional
    [a-z0-9]        # a letter or digit
)+                  # group may appear 1 or more times
['_-]?              # apos, dash or underscore, optional
(?:                 # start non capture group
    (?<!')          # negative lookbehind, make sure we haven't apos before
    's              # apos and s
  |                 # OR
    s'              # s and apos
  |                 # OR
    [a-z]           # a letter
)                   # end group
(?=\s|$)            # lookahead, make sure we have a space or end of line after

Демо

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