Регулярное выражение для \ b - PullRequest
1 голос
/ 22 сентября 2009

Я пишу регулярные выражения для текста Unicode в Java. Однако для конкретного сценария, который я использую, - Деванагари (0900 - 097F), существует проблема с границами слов. \ b соответствует символам, которые являются зависимыми гласными (например, 093E-094C), поскольку они обрабатываются как пробельные символы.

Пример: Предположим, у меня есть строка: "कमल कमाल कम्हल कम्हाल" Обратите внимание, что «मा» во втором слове формируется путем объединения comb и ा (распознается как пробел). Аналогично в последнем слове. Это приводит к тому, что \ b сопоставляет 'ल' в 'कमाल' с регулярным выражением \ b \ w \ b, что неверно в зависимости от языка.

Надеюсь, пример поможет.

Могу ли я написать регулярное выражение, которое ведет себя как \ b, за исключением того, что оно не соответствует определенным символам? Любой отзыв будет благодарен.

Ответы [ 2 ]

1 голос
/ 22 сентября 2009

Эквивалент для границ слова (если границы не соответствуют ожиданиям):

 (?<!=[x-y])(<?=[x-y])...(?<=[x-y])(?![x-y])

Это потому, что «граница слова» означает «место, где есть символ с одной стороны, а не с другой)

Таким образом, с помощью выражений прогнозирования и прогнозирования вы можете определить свой собственный класс символов [x-y], чтобы проверять, когда вы хотите изолировать «границу слова»

1 голос
/ 22 сентября 2009

Вы должны быть в состоянии выполнить то, что вы хотите, с помощью следующих операторов регулярных выражений:

(?=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

(Выше приведено в документации по API Java 6 Pattern .)

Используйте (?<![foo])(?=[foo]) вместо \b перед словом и (?<=[foo])(?![foo]) вместо \b после слова, где "[foo]" - ваш набор "символов слова"

...