Есть ли способ использовать регулярное выражение для символов с тильдой? - PullRequest
2 голосов
/ 05 декабря 2010

Посмотрите на это:

"nAo".match(/(nao)/i) # => #<MatchData "nAo" 1:"nAo">

"nÃo".match(/(não)/i) # => nil

есть ли способ это исправить?

Edit: Похоже, что в ruby ​​отсутствует поддержка символов юникода при сравнении регулярных выражений с флагом i (игнорировать регистр) ... Использование МРТ 1.8.7p249

Ответы [ 3 ]

7 голосов
/ 05 декабря 2010

Не знаю о Ruby, но большинство движков регулярных выражений не понимают прописные / строчные буквы для не ASCII-символов. Лучшее, что вы можете сделать, это:

/(n[ãÃ]o)/

Проблема с пониманием отношения прописных / строчных букв заключается в том, что оно зависит от языка. Юникод кодирует только форму символа, а не его значение. Следовательно, заглавные буквы в Unicode могут иметь разные строчные буквы в зависимости от языка.

Взять, к примеру, SS. На английском языке строчная буква будет ss, но на немецком это может быть ß. Другим примером является буква I, которая на английском языке имеет строчную букву i, но на турецком языке ее строчная буква ı (без точки). Это потому, что i на турецком языке имеет заглавные буквы İ (с точкой).

Из-за этого большинство реализаций регулярных выражений просто сдаются и отказываются понимать прописные / строчные отношения для символов вне стандартного ASCII.

0 голосов
/ 06 декабря 2010

Обратите внимание, что в Ruby улучшена поддержка персонажей с 1.9 (похоже, вы запускаете Ruby 1.8.7).Старый движок регулярных выражений был заменен на Oniguruma в Ruby 1.9.

http://www.geocities.jp/kosako3/oniguruma/

0 голосов
/ 05 декабря 2010

Попробуйте найти несколько нормализаций Юникода модулей для Ruby.

...