Как я могу использовать регулярные выражения с поддержкой Юникода в JavaScript?
Например, должно быть что-то похожее на \w
то, что может соответствовать любой кодовой точке в категории «Буквы или метки» (не только ASCII), и, надеюсь, иметь фильтры типа [[P *]] для пунктуации и т. Д.
javascript
regex
unicode
character-properties
Питер Мортенсен
источник
источник
Ответы:
Ситуация для ES 6
Предстоящая спецификация языка ECMAScript, выпуск 6, включает регулярные выражения с поддержкой Юникода. Поддержка должна быть включена с
u
модификатором на регулярном выражении. См. Регулярные выражения с поддержкой Юникода в ES6 .До тех пор, пока ES 6 не закончится и не получит широкое распространение среди поставщиков браузеров, вы все еще будете сами по себе. Обновление: теперь существует транспортер с именем regexpu, который переводит регулярные выражения ES6 Unicode в эквивалентный ES5. Он может быть использован как часть вашего процесса сборки. Попробуйте это онлайн.
Ситуация для ES 5 и ниже
Хотя JavaScript работает со строками Unicode, он не реализует классы символов с поддержкой Unicode и не имеет понятия о классах символов POSIX или блоках / поддиапазонах Unicode.
Проблемы с Unicode в регулярных выражениях JavaScript
Проверьте свои ожидания здесь: Тестер Javascript RegExp Unicode Character Class ( Редактировать: оригинальная страница не работает, интернет-архив все еще имеет копию .)
Flagrant Badassery имеет статью о JavaScript, Regex и Unicode, которая проливает свет на этот вопрос.
Также читайте Regex и Unicode здесь, на SO. Вероятно, вы должны создать свой собственный "класс знаков препинания".
Ознакомьтесь с регулярным выражением: совпадение диапазона блока Unicode , который позволяет вам создавать регулярные выражения JavaScript, которые соответствуют символам, попадающим в любое количество указанных блоков Unicode.
Я только что сделал это для поддиапазонов «Общая пунктуация» и «Дополнительная пунктуация», и результат такой простой и прямой, как я и ожидал:
Также существует XRegExp , проект, который обеспечивает поддержку Unicode для JavaScript , предлагая альтернативный движок регулярных выражений с расширенными возможностями.
И, конечно, необходимо прочитать: mathiasbynens.be - в JavaScript есть проблема с Unicode :
источник
u
флаг, а также некоторые другие особенности ES6 для работы с Unicode.u
регулярных выражений."a品cd!e f".replace(/[^\w]/ug, "")
но полученное регулярное выражение (запущенное в Chrome 59) по-прежнему удаляет品
персонажа и возвращает только"acdef"
Лично я бы не стал устанавливать другую библиотеку только для того, чтобы получить эту функциональность. Мой ответ не требует никаких внешних библиотек, и он может также работать с небольшими изменениями для регулярных выражений, кроме JavaScript.
Веб-сайт Unicode предоставляет возможность переводить категории Unicode в набор кодовых точек. Так как это Юникод , информация с него должна быть точной.
Обратите внимание, что вам нужно будет исключить символы высокого уровня, так как JavaScript может обрабатывать только символы меньше
FFFF
(шестнадцатеричные). Я предлагаю установить флажки Abbreviate Collate и Escape, чтобы найти баланс между недопущением непечатных символов и уменьшением размера регулярного выражения.Вот некоторые общие расширения различных свойств Unicode:
\p{L}
(Письма):\p{Nd}
(Количество десятичных цифр):\p{P}
(Пунктуация):На странице также распознается ряд непонятных классов символов, например
\p{Hira}
, это только (японские) символы хирагана:Наконец, можно подключить класс char с более чем одним свойством Unicode, чтобы получить более короткое регулярное выражение, чем можно было бы просто объединить их (при условии проверки определенных настроек).
источник
\p
-Синтаксис, похоже, не работает в JS,/\p{L}/.test('a')
этоfalse
Также, не найдя хорошего решения, я давно написал небольшой скрипт , загружая данные из спецификации Unicode (v.5.0.0) и генерируя интервалы для каждой категории и подкатегории Unicode в BMP (в последнее время замененный на небольшой Java-программа, которая использует собственную поддержку Unicode).
По сути, он преобразуется
\p{...}
в диапазон значений, очень похожий на результат работы инструмента, упомянутого Томалаком, но интервалы могут оказаться довольно большими (поскольку он имеет дело не с блоками, а с символами, разбросанными по разным местам).Например, Regex написано так:
Будет преобразован во что-то вроде этого:
Я практически не использовал его на практике, но, похоже, он отлично работает из моих тестов, поэтому я публикую здесь на тот случай, если кто-то посчитает это полезным. Несмотря на длину получаемых регулярных выражений (в приведенном выше примере при развертывании используется 3591 символ), производительность кажется приемлемой (см. Тесты в jsFiddle; спасибо @modiX и @Lwangaman за улучшения).
Вот источник (raw, 27,5KB; минимизированный , 24,9KB, не намного лучше ...). Это может быть уменьшено путем удаления символов юникода, но OTOH рискует вызвать проблемы с кодировкой, поэтому я оставляю все как есть. Надеюсь, с ES6 такого рода вещи больше не понадобятся.
Обновление : похоже на ту же стратегию, принятую в плагине XRegExp Unicode, о которой упоминал Тим Даун, за исключением того, что в этом случае используются регулярные регулярные выражения JavaScript.
источник
/^\p{L}+$/
должно совпадать,東海林
но это не так. Всякий раз, когда вы обновляете коллекцию, пожалуйста, сообщите мне. Большое спасибо.\p{Lo}
, вы пропускаете обе таблицы кандзи в ней.Как упоминалось в других ответах, регулярные выражения JavaScript не поддерживают классы символов Unicode. Однако есть библиотека, которая обеспечивает это: превосходный XRegExp Стивена Левитана и его плагин Unicode .
источник
[^\u0000-\u007F]+
для любых символов, которые не включены символы ASCII.Например:
Вот несколько прекрасных ссылок:
Unicode диапазон RegExp генератор
Юникод Регулярные выражения
Диаграммы кодов символов Unicode 10.0
Соответствует диапазону блоков Unicode
источник
Сентябрь 2018 года (обновлено в феврале 2019 года)
Похоже, что регулярное выражение
/\p{L}/u
для букв совпадения (как категории Unicode )Вот рабочий пример
Я сообщаю об этой ошибке здесь .
Обновить
По прошествии более 2 лет, согласно: 1500035 > 1361876 > 1634135, наконец, эта ошибка исправлена и будет доступна в Firefox v.78 +.
источник
Это сделает это:
Он явно выбирает диапазон символов Unicode. Это будет работать для латинских символов, но другие странные символы могут быть вне этого диапазона.
источник
\u0100
и\u0280
: многие из тех , кто может рассматриваться как латинские символы , но другие не так : Var з = «»; for (var i = 0xff; i <= 0x280; i ++) {s + = String.fromCharCode (i)} "ÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿŀŁłŃńŅņŇňʼnŊŋŌōŎŏ ... ǐǑǒǓǔǕǖǗǘǙǚǛǜǝǞǟǠǡǢǣǤǥǦǧǨǩǪǫǬǭǮǯǰDZDzdzǴǵǶǷǸǹǺǻǼǽǾǿȀȁȂȃȄȅȆȇȈȉȊȋȌȍȎȏȐȑȒȓȔȕȖȗȘșȚțȜȝȞȟȠȡȢȣȤȥȦȧȨȩȪȫȬȭȮȯȰȱȲȳȴȵȶȷȸȹȺȻȼȽȾȿɀɁɂɃɄɅɆɇɈɉɊɋɌɍɎɏɐɑɒɓɔɕɖɗɘəɚɛɜɝɞɟɠɡɢɣɤɥɦɧɨɩɪɫɬɭɮɯɰɱɲɳɴɵɶɷɸɹɺɻɼɽɾɿʀ"В JavaScript \ w и \ d - это ASCII, а \ s - это Юникод. Не спрашивай меня почему. JavaScript поддерживает \ p с категориями Unicode, которые вы можете использовать для эмуляции Unicode-осведомленных \ w и \ d.
Для \ d используйте \ p {N} (числа)
Для \ w используйте [\ p {L} \ p {N} \ p {Pc} \ p {M}] (буквы, цифры, подчеркивания, знаки)
Обновление: К сожалению, я был неправ по этому поводу. JavaScript также официально не поддерживает \ p, хотя некоторые реализации могут все еще поддерживать это. Единственная поддержка Юникода в регулярных выражениях JavaScript - это сопоставление определенных точек кода с \ uFFFF. Вы можете использовать их в диапазонах в классах символов.
источник
/\p{L}+/u
Если вы используете Babel, то поддержка Unicode уже доступна.
Я также выпустил плагин, который преобразует ваш исходный код так, что вы можете писать регулярные выражения, такие как
/^\p{L}+$/
. Затем они будут преобразованы в то, что понимают браузеры.Вот страница проекта плагина:
Бабель-плагин-UTF-8-регулярное выражение
источник
Я отвечаю на этот вопрос
Что было бы эквивалентно для \ p {Lu} или \ p {Ll} в regExp для js?
поскольку он был помечен как точная копия текущего старого вопроса.
При запросе к базе данных UCD Unicode 12, \ p {Lu} генерирует 1788 кодовых точек.
Преобразование в UTF-16 дает эквивалентность конструкции класса.
Это всего лишь строка из 4 тыс. Символов, которую легко реализовать в любых движках регулярных выражений.
Опрашивая базу данных UCD Unicode 12, \ p {Ll} генерирует 2151 кодовых точек.
Преобразование в UTF-16 дает эквивалентность конструкции класса.
Обратите внимание, что реализация \ p {Lu} или \ p {Pl} в регулярном выражении фактически вызывает
нестандартную функцию для проверки значения.
Классы символов, показанные здесь, сделаны по-разному и являются линейными, стандартными
и довольно медленными, когда они в основном объединены в один класс.
Некоторое понимание того, как движок Regex (в целом) реализует классы свойств Unicode:
Изучите эти характеристики производительности между свойством
и блоком классов (как выше)
Вау какая разница !!
Давайте посмотрим, как могут быть реализованы свойства
Массив указателей [10FFFF], где каждый индекс является кодовой точкой
Каждый указатель в массиве является структурой классификации.
Структура классификации содержит фиксированные элементы поля.
Некоторые NULL и не имеют отношения.
Некоторые содержат классификацию категорий.
Пример: общая категория
Это растровый элемент, который использует 17 из 64 бит.
Независимо от того, что поддерживает эта кодовая точка, биты установлены в качестве маски.
-Close_Punctuation
-Connector_Punctuation
-контроль
-Currency_Symbol
-Dash_Punctuation
-Decimal_Number
-Enclosing_Mark
-Final_Punctuation
-format
-Initial_Punctuation
-Letter_Number
-Line_Separator
-Lowercase_Letter
-Math_Symbol
-Modifier_Letter
-Modifier_Symbol
-Nonspacing_Mark
-Open_Punctuation
-Other_Letter
-Other_Number
-Other_Punctuation
-Other_Symbol
-Paragraph_Separator
-Private_Use
-Space_Separator -Surrogate
-Spacing_Mark
-Titlecase_Letter
-Unassigned
-Uppercase_Letter
Когда регулярное выражение анализируется с чем-то вроде этого \ p {Lu}, оно
переводится непосредственно в
Другой пример, когда регулярное выражение анализируется со свойством пунктуации \ p {P}, оно
переводится в
Проверка этого элемента для любого из этих элементов битов, которые объединены в маску:
-Close_Punctuation
-Connector_Punctuation
-Dash_Punctuation
-Final_Punctuation
-Initial_Punctuation
-Open_Punctuation
-Other_Punctuation
Смещение и бит или бит (маска) сохраняются как шаг регулярного выражения для этого свойства.
Таблица поиска создается один раз для всех кодовых точек Unicode, использующих этот массив.
Когда проверяется символ, это так же просто, как использование CP в качестве индекса в этом массиве и проверка определенного элемента структуры классификации для этого бита (маски).
Эта структура является расширяемой и непрямой, чтобы обеспечить гораздо более сложные поиски. Это всего лишь простой пример.
Сравните этот прямой поиск с поиском классов символов:
Все классы представляют собой линейный список предметов, ищущих слева направо.
В этом сравнении, учитывая, что наша целевая строка содержит только полные буквы в верхнем регистре Unicode, закон средних значений предсказывает, что половина элементов в классе должна быть проверена на предмет ранжирования, чтобы найти совпадение.
Это огромный недостаток в производительности.
Однако, если таблицы поиска отсутствуют или не соответствуют последней версии Unicode (12 на эту дату)
то это будет единственный путь.
На самом деле, это в основном единственный способ получить полные
символы эмодзи, поскольку для их назначения нет конкретного свойства (или аргументации).
источник
Вы также можете использовать:
источник