Regex Word-Break с диакритическими знаками Unicode - PullRequest
0 голосов
/ 03 октября 2009

Я работаю над приложением, которое ищет текст с использованием регулярных выражений на основе ввода от пользователя. Пользователь может включить подстановочный знак «Совпадение 0 или более символов», используя звездочку. Мне нужно, чтобы это соответствовало только границам слов. Первой моей попыткой было преобразовать все звездочки в (?:(?=\B).)*, что в большинстве случаев работает нормально. Там, где он терпит неудачу, очевидно, что .Net рассматривает положение между символом юникода с диакритическим знаком и другим символом как разрыв слова. Я считаю это ошибкой и отправил ее на сайт обратной связи Microsoft .

Тем временем, однако, мне нужно реализовать функциональность и отгрузить продукт. Я рассматриваю возможность использования [\p{L}\p{M}\p{N}\p{Pc}]* в качестве замещающего текста, но, честно говоря, я нахожусь в земле "Я действительно не понимаю, что это будет делать". Я имею в виду, что могу прочитать спецификации, но не уверен, что смог бы достаточно проверить это, чтобы убедиться, что он выполняет то, что я ожидаю. Я просто не знаю всех граничных условий для тестирования. Приложение используется межкультурными работниками, многие из которых находятся в племенных местах, поэтому необходимо поддерживать любые системы письма, в том числе те, которые используют разрывы слов нулевой ширины.

Есть ли у кого-нибудь более изящное решение, или он может подтвердить / исправить приведенный выше код или предложить несколько указателей?

Спасибо за вашу помощь.

1 Ответ

2 голосов
/ 03 октября 2009

Эквивалент /(?:(?=\B).)*/ в контексте Unicode будет:

/
(?:
  (?: (?<=[\p{L}\p{M}\p{N}\p{Pc}]) (?=[\p{L}\p{M}\p{N}\p{Pc}])
  |   (?<![\p{L}\p{M}\p{N}\p{Pc}]) (?![\p{L}\p{M}\p{N}\p{Pc}])
  )
  .
)*
/

... или несколько упрощенно:

/(?:[\p{L}\p{M}\p{N}\p{Pc}]+|[^\p{L}\p{M}\p{N}\p{Pc}]+)?/

Это будет соответствовать последовательности слов или неслов (последовательность, пунктуация и т. Д.), Возможно, пустой.

Нормальная или отрицательная граница слова (\b или \B) - это, по сути, двойное осмотр. Один оглядывается назад, проверяя тип персонажа, который предшествует текущей позиции. Точно так же один смотрит в будущее.

Во втором регулярном выражении я удалил осмотры и вместо этого использовал простые классы символов.

...