Регулярное выражение для \b
-
12-09-2019 - |
Вопрос
Я пишу регулярные выражения для текста в юникоде на Java.Однако для конкретного скрипта, который я использую - Devanagari (0900 - 097F), существует проблема с границами слов.\b соответствует символам, которые являются зависимыми гласными (например, 093E-094C), поскольку они обрабатываются как символы пробела.
Пример:Предположим, у меня есть строка:"कमल कमाल कम्हल कम्हाल" Обратите внимание, что 'मा' во 2-м слове образовано сочетанием ा и ा (распознается как символ пробела).Аналогично и в последнем слове.Это приводит к тому, что \b сопоставляет 'я' в 'я' с регулярным выражением \b \ w \ b, которое неверно в соответствии с языком.
Я надеюсь, что этот пример поможет.
Могу ли я написать регулярное выражение, которое ведет себя как \b, за исключением того, что оно не соответствует определенным символам?Будем благодарны за любой отзыв.
Решение
Вы должны быть в состоянии выполнить то, что вы хотите, со следующими операторами регулярных выражений:
(?=X) X, via zero-width positive lookahead
(?!X) X, via zero-width negative lookahead
(?<=X) X, via zero-width positive lookbehind
(?<!X) X, via zero-width negative lookbehind
(Приведенное выше цитируется из Документы Java 6 Pattern API.)
Использование (?<![foo])(?=[foo])
на месте \b
перед словом, и (?<=[foo])(?![foo])
на месте \b
после одного слова, где "[foo]
" это ваш набор "словесных символов"
Другие советы
Эквивалентом для границ слов (если границы не соответствуют вашим ожиданиям) будет:
(?<!=[x-y])(<?=[x-y])...(?<=[x-y])(?![x-y])
Это потому, что "граница слова" означает "местоположение, где есть символ с одной стороны, а не с другой)
Таким образом, с помощью выражений look-behind и look-ahead вы можете определить свой собственный класс символов [x-y], чтобы проверить, когда вы хотите выделить "границу слова".