Вопрос

Я пишу регулярные выражения для текста в юникоде на 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], чтобы проверить, когда вы хотите выделить "границу слова".

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top