Совпадение во всей строке с пунктуацией (проблемы с использованием \ b) - PullRequest
1 голос
/ 07 февраля 2020

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

basic school co-operative limited

Если мы применим следующее регулярное выражение, мы получим co-operative и limited, как и ожидалось. Это происходит из-за порядка в генераторах:

\b(co-operative|co|co.|limited)\b

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

\b(co|co.|co-operative|limited)\b

В этом сценарии будет соответствовать co limited вместо co-operative limited. У нас есть какой-нибудь способ решить проблему в порядке чередования?

Спасибо за вашу бесценную помощь

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Поскольку вы хотите сопоставить полные слова, вы можете изменить утверждение \b в конце регулярного выражения на положительный прогноз для пробела или конца строки, например

\b(co|co.|co-operative|limited)(?=\s|$)

Демонстрация по регулярному выражению regex101

Если вы хотите разрешить определенную пунктуацию после слова, вы можете добавить это в поле зрения, например,

\b(co|co.|co-operative|limited)(?=[\s.]|$)
0 голосов
/ 07 февраля 2020

Вы можете попробовать заменить чередование с помощью? -Quantifier для захвата самой длинной версии, если это возможно:

\b(co(-operative)?.?|limited)\b

https://regex101.com/r/1D6BsU/1

к сожалению, это также будет соответствовать «кооперативам», поэтому мы можем быть немного более явными, чтобы избежать этого граничного случая:

\b(co(-operative(?=\b))?.?|limited)\b

https://regex101.com/r/1D6BsU/2

...