Регулярное выражение для \b

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

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

Я надеюсь, что пример поможет.

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


person rohit.arondekar    schedule 22.09.2009    source источник
comment
Добавил пример. Я надеюсь, что это имеет смысл.   -  person rohit.arondekar    schedule 22.09.2009
comment
Можно ли это сделать с помощью выражения [^] (не в диапазоне)?   -  person Vincent De Smet    schedule 22.09.2009
comment
Вы должны сделать ответ Лоуренса официальным: он ответил первым;)   -  person VonC    schedule 22.09.2009
comment
Сделанный. Всем спасибо за помощь :) Stackoverflow рулит!   -  person rohit.arondekar    schedule 22.09.2009


Ответы (2)


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

(?=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. Документация по API.)

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

person Laurence Gonsalves    schedule 22.09.2009
comment
Я думал об этом, но после прочтения regular-expressions.info/wordboundaries.html я был немного смущен, если это сработает. - person rohit.arondekar; 22.09.2009

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

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

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

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

person VonC    schedule 22.09.2009
comment
Ладно, думаю, теперь я понимаю. И ваш ответ, и ответ Лоуренса верны, что я отмечаю как правильный? :D - person rohit.arondekar; 22.09.2009