Unicode в Javascript Regexen
Как и сама Java, Javascript не поддерживает Unicode в своих \w
, \d
и \b
регулярных выражениях regex.Это (возможно) ошибка в Java и Javascript.Даже если из-за казуистики или упрямства удается утверждать, что это , а не ошибка, это, безусловно, большая ошибка.Что-то вроде укусов.
Проблема заключается в том, что эти популярные ярлыки регулярных выражений только применяются к 7-битному ASCII как в Java, так и в Javascript.Это ограничение мучительно 1970-х годов;это не имеет абсолютно никакого смысла в 21 веке.Это сообщение в блоге , сделанное в марте этого года, дает хороший аргумент для исправления этой проблемы в Javascript.
Было бы очень приятно , если бы какая-нибудь публично настроенная душа добавилаJavascript для этой страницы Википедии , в которой сравниваются функции регулярного выражения в разных языках.
Эта страница говорит о том, что Javascript вообще не поддерживает свойства Юникода.На этом же сайте есть таблица , что намного более подробно, чем страница Википедии, о которой я упоминал выше.Для функций Javascript, посмотрите под его столбцом ECMA.
Однако в некоторых случаях эта таблица устарела как минимум на пять лет, поэтому я не могу полностью за нее поручиться.Впрочем, это хорошее начало.
Поддержка Unicode на других языках
Ruby, Python, Perl и PCRE предлагают способы расширения \w
до значения, которое предполагается значить, но две J-вещицы не имеют.
В Java, однако, - это хороший обходной путь.Там вы можете использовать \pL
для обозначения любого символа, который имеет свойство Unicode General_Category = Letter.Это означает, что вы всегда можете эмулировать правильное значение \w
, используя [\pL\p{Nd}_]
.
Действительно, даже писать его таким образом есть преимущество, потому что оно информирует вас о том, что вы добавляете десятичные числа и символ подчеркивания.в класс персонажа.С простым \w
, пожалуйста, иногда забывайте, что это происходит.
Я не верю, что этот обходной путь доступен в Javascript, хотя.Вы также можете использовать свойства Unicode, такие как в Perl и PCRE, а также в Ruby 1.9, но не в Python.
Единственные свойства Unicode, которые в настоящее время поддерживает Java, - это одно- и двухсимвольные общие свойства, такие как \pN
и \p{Lu}
, и свойства блока, такие как \p{InAncientSymbols}
, но не сценарии, такие как \p{IsGreek}
и т. Д.
Будущий JDK7 наконец-то найдет способ добавить скрипты.Даже тогда Java по-прежнему не будет поддерживать большинство свойств Unicode, хотя даже не критичные, такие как \p{WhiteSpace}
или удобные, такие как \p{Dash}
и \p{Quotation_Mark}
.
SIGH! Чтобы понять, насколько ограничена поддержка свойств Java, просто сравните ее с Perl.Perl поддерживает 1633 свойства Unicode начиная с выпуска 5.10 2007 года, и 2478 из них начиная с выпуска 5.12 этого года.Я не считал их для древних выпусков, но Perl начал поддерживать свойства Unicode еще в прошлом тысячелетии.
Хромый, как Java, он все же лучше, чем Javascript, потому что Javascript не поддерживает никаких свойств Unicode, поэтому CENSORED никогда.Боюсь, что мрачное 7-битное мышление Javascript делает его практически непригодным для Unicode.Это чрезвычайно большая зияющая дыра в языке, которую чрезвычайно трудно объяснить, учитывая ее целевой домен.
Извините, но об этом.☹