Не найдя также и хорошего решения, я давно написал небольшой скрипт , загружая данные из спецификации Unicode (v.5.0.0) и генерируя интервалы для каждой категории и подкатегории Unicode в BMP (в последнее время заменен небольшой Java-программой , которая использует собственную поддержку Unicode).
По сути, он преобразует \p{...}
в диапазон значений, во многом как результат работы инструмента , упомянутого Томалаком, но интервалы могут оказаться довольно большими (так как он имеет дело не с блоками, а с персонажи разбросаны по разным местам).
Например, регулярное выражение, написанное так:
var regex = unicode_hack(/\p{L}(\p{L}|\p{Nd})*/g);
Будет преобразован во что-то вроде этого:
/[\u0041-\u005a\u0061-\u007a...]([...]|[\u0030-\u0039\u0660-\u0669...])*/g
Практически не использовал его на практике, но, похоже, он отлично работает по моим тестам, поэтому я публикую здесь на тот случай, если кто-то посчитает это полезным. Несмотря на длину получаемых регулярных выражений (в приведенном выше примере при развертывании используется 3591 символ), производительность кажется приемлемой (см. тесты в jsFiddle; спасибо @modiX и @Lwangaman за улучшения).
Вот источник (необработанный, 27,5 КБ; минимизированный , 24,9 КБ, не намного лучше ...). может быть уменьшено за счет удаления символов Unicode, но OTOH рискует столкнуться с проблемами кодирования, поэтому я ухожу, как есть. Надеюсь, с ES6 такого рода вещи больше не понадобятся.
Обновление : похоже на ту же стратегию, принятую в плагине XRegExp Unicode , о котором говорил Тим Даун, за исключением того, что в этом случае используются регулярные регулярные выражения JavaScript.