Regex, чтобы найти слова без двойного "L" - PullRequest
2 голосов
/ 10 апреля 2020

Попытка извлечь все слова в тексте, которые содержат только одну последовательную букву "l" без учета регистра.

Например:
"Здравствуйте, вы видели большой ореол вокруг солнца?"

  • большой -> захваченный
  • гало -> захваченный

Я перепробовал так много комбинаций, но ни одна из них даже близко не подошла. Я полагаю, что я должен использовать негативную перспективу, негативную ретроспективную или предыдущую группу захвата "\ 1", но я никогда не понимал, как использовать эти, и как правило, избегал их, и все мои попытки использовать их потерпели неудачу.

Ответы [ 2 ]

4 голосов
/ 10 апреля 2020

Вы можете использовать

(?i)\b(?!\w*?ll)\w*l\w*
/\b(?!\w*?ll)\w*l\w*/i

См. Демоверсию regex

Подробности

  • (?i) - режим нечувствителен к регистру при
  • \b - граница слова
  • (?!\w*?ll) - без ll допускается после любых 0+ "словесных" символов: цифры, буквы, _ с (как можно меньше)
  • \w*l\w* - 0+ слов, l и снова 0+ слов.
1 голос
/ 10 апреля 2020

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

\b[a-km-z]*l(?:[a-km-z]+l)*[a-km-z]*\b

Демо

Механизм регулярных выражений выполняет следующие операции:

\b           # match a word break
[a-km-z]*    # match 0+ letters other than 'l'
l            # match 'l'
(?:          # begin non-capture group
  [a-km-z]+  # match 1+ letters other than 'l'
  l          # match 'l' 
)            # end non-capture group
*            # execute non-capture group 0+ times
[a-km-z]*    # match 0+ letters other than 'l'
\b           # match a word break

С PCRE (PHP) и некоторыми другими механизмами регулярных выражений вы можете использовать вызовы подпрограмм , чтобы уменьшить количество повторений и вероятность ошибок. Здесь это будет

\b([a-km-z])*l(?:(?1)+l)*(?1)*\b

или

\b(?P<allbutl>[a-km-z])*l(?:(?P>allbutl)+l)*(?P>allbutl)*\b

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

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