Как я могу использовать в JavaScript регулярные выражения с поддержкой Unicode?
Например, должно быть что-то вроде \w, которое может соответствовать любой кодовой точке в категории Letters или Marks (а не только ASCII), и, надеюсь, иметь фильтры, такие как [[P *]] для знаков препинания и т. д.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Предстоящая спецификация языка ECMAScript, издание 6, включает регулярные выражения, поддерживающие Unicode. Поддержка должна быть включена с помощью модификатора u в регулярном выражении. См. Регулярные выражения с поддержкой Unicode в ES6.
Однако до тех пор, пока ES 6 не будет завершен и широко распространен среди поставщиков браузеров, вы все еще сами по себе. Обновлять: Теперь существует транспилятор с именем регулярное выражение, который переводит регулярные выражения Unicode ES6 в эквивалентные ES5. Его можно использовать как часть процесса сборки. Попробуйте онлайн.
Несмотря на то, что JavaScript работает со строками Unicode, он не реализует классы символов, поддерживающие Unicode, и не имеет концепции классов символов POSIX или блоков / поддиапазонов Unicode.
Проверьте свои ожидания здесь: Javascript RegExp тестер класса символов Unicode (Редактировать: исходная страница не работает, в Интернет-архиве еще есть копия.)
У вопиющего Badassery есть статья о JavaScript, регулярное выражение и Юникод, которая проливает свет на этот вопрос.
Также прочтите Регулярное выражение и Юникод здесь, на SO. Возможно, вам придется создать свой собственный «класс знаков препинания».
Ознакомьтесь с конструктором Регулярное выражение: соответствие диапазону блоков Unicode, который позволяет создавать регулярное выражение JavaScript, которое соответствует символам, попадающим в любое количество указанных блоков Unicode.
Я только что проделал это для поддиапазонов «Общая пунктуация» и «Дополнительная пунктуация», и результат оказался таким простым и понятным, как я и ожидал:
[\u2000-\u206F\u2E00-\u2E7F]
Также существует проект XRegExp, который приносит Поддержка Unicode в JavaScript, предлагая альтернативный механизм регулярных выражений с расширенными возможностями.
И, конечно же, обязательное чтение: mathiasbynens.be - в JavaScript есть проблема с Unicode:
Этот последний инструмент отлично подходит для блоков, но мало что дает, когда вам нужны типы символов, разбросанные по множеству блоков (например, буквы или цифры). См. это для аналогичного подхода для этого случая.
u, а также некоторые другие Особенности ES6 для работы с Unicode.
@UselessCode Да, Babel и Traceur используют регулярное выражение как зависимость для транспиляции этих регулярных выражений u.
Если вам нужны классы символов Юникода, такие как \ pL, и поддержка старых браузеров, то библиотека XRegExp (см. Там собственный флаг A) определенно будет оптимальным решением. Спасибо!
К сожалению, онлайн-транспилятор не работал у меня, используя \ w с китайскими иероглифами. Пытался транспилировать "a品cd!e f".replace(/[^\w]/ug, ""), но полученное регулярное выражение (запущенное в Chrome 59) по-прежнему удаляет символ 品 и возвращает только "acdef"
@mwag ES6 по-прежнему не используется в браузерах по умолчанию. Задайте, пожалуйста, отдельный вопрос, у вас уже есть все необходимые детали. Если возможно, дайте ссылку на ответ здесь, чтобы я мог обновить этот пост.
@Tomalak Я не пытался запускать ES6, а скорее ES5, поэтому я попробовал транспилер. "a品cd!e f".replace(/[^\w]/ug, "") преобразуется в ES5 "a品cd!e f".replace(/(?:[\0-/:-@\[-\^`\{-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/g, ""), что приводит к неверному результату "acdef"
Отличный материал для отдельного вопроса. Вы сделали всю домашнюю работу. Пока я использую мобильный телефон, я могу только писать комментарии. Пожалуйста, откройте отдельную тему.
Просто говорю, никогда не используйте \w, он имеет другое значение в зависимости от локали env. Предпочитать \\pL из библиотеки XRegExp
Вы имеете в виду атрибут проверки ввода в полях формы? Он использует то же регулярное выражение, что и встроенный в JS-движок данного браузера, и компилируется с отключенными флагами (увидеть этот ответ). Я предполагаю, что это будет включать флаг u, даже если бы он поддерживался, но я не уверен на 100%. Было бы неплохо задать здесь отдельный вопрос, хотя вы легко можете выяснить это экспериментально.
В JavaScript \ w и \ d - это ASCII, а \ s - Unicode. Не спрашивайте меня, почему. JavaScript поддерживает \ p с категориями Unicode, которые вы можете использовать для имитации \ w и \ d, поддерживающих Unicode.
Для \ d используйте \ p {N} (числа)
Для \ w используйте [\ p {L} \ p {N} \ p {Pc} \ p {M}] (буквы, цифры, подчеркивания, знаки)
Обновлять: К сожалению, я ошибался. JavaScript также официально не поддерживает \ p, хотя некоторые реализации могут это поддерживать. Единственная поддержка Unicode в регулярных выражениях JavaScript - это сопоставление определенных кодовых точек с помощью \ uFFFF. Вы можете использовать их в диапазонах классов символов.
Почему? почему столько боли?
Он поддерживается в Node 12. Но нужно добавить модификатор u: /\p{L}+/u.
Как упоминалось в других ответах, регулярные выражения JavaScript не поддерживают классы символов Unicode. Однако есть библиотека, которая это обеспечивает: превосходные XRegExp Стивена Левитана и его Плагин Unicode.
Хотя эта ссылка может дать ответ на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если ссылка на страницу изменится. - Из обзора
@mustaccio: Я не согласен. Этот ответ рекомендует использовать библиотеку. Если библиотека уходит, ответ, дублирующий снимок документации библиотеки, так же бесполезен, как и ответ, который просто ссылается на библиотеку.
Также не найдя хорошего решения, я давно написал небольшой сценарий, загрузив данные из юникода Спецификация (v.5.0.0) и сгенерировав интервалы для каждой категории и подкатегории юникода в 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 КБ, не намного лучше ...). мощь можно уменьшить за счет отмены экранирования символов юникода, но OTOH может вызвать проблемы с кодированием, поэтому я оставлю как есть. Надеюсь, с ES6 в этом больше не будет необходимости.
Обновлять: это похоже на ту же стратегию, что и в Подключаемый модуль XRegExp Unicode, упомянутом Тимом Дауном, за исключением того, что в этом случае используются регулярные регулярные выражения JavaScript.
Я использовал ваш сценарий для решения своей проблемы (stackoverflow.com/questions/23391573/…), но ваши диапазоны Unicode не включают тайваньские, китайские или японские символы. поэтому /^\p{L}+$/ должен соответствовать 東海林, но это не так. Когда вы обновляете коллекцию, пожалуйста, сообщайте мне. Большое спасибо.
Хорошо, это просто. Тайваньский, китайский и японский языки используют эту таблицу юникода: rikai.com/library/kanjitables/kanji_codes.unicode.shtml Хотя у вас есть таблица катакана в \p{Lo}, вы упускаете обе таблицы кандзи в ней.
@modiX Спасибо, что указали на это! Я обновил сценарий, на этот раз используя Java, до создать список - вместо того, чтобы удалять их из файлов Unicode. Я планирую добавить поддержку SMP, если это возможно.
Спасибо за это. Уии, глядя на дополнительный многоязычный уровень юникода, есть еще много того, что нужно сделать, я не знал, что это еще не включено. Пожалуйста, информируйте меня, когда добавляете их в вашу текущую программу Java (вывод).
@modiX К сожалению, я обнаружил, что регулярные выражения JavaScript не могут обрабатывать интервалы между символами вне BMP (пример). Поскольку это ключевой момент в моей реализации, это означает, что я никогда не смогу добавить надлежащую поддержку SMP! :( Таким образом, мое решение пока ограничено BMP, будем надеяться, что EcmaScript 6 улучшит ситуацию ...
похоже на удобный скрипт, как вы думаете, можно ли добавить к нему модификатор "\ p {L &}"? Он должен соответствовать любому символу, имеющему соответствующий аналог в верхнем или нижнем регистре.
@Lwangaman Думаю, я мог бы, но это стандарт? Никогда раньше не видел ... У вас есть ссылки, на которые я могу взглянуть (независимо от языка)?
Я добавил его в пример JSFiddle (и получил ul и li для правильного рендеринга): jsfiddle.net/Waxkc/49 Здесь вы можете найти ссылку на модификатор \ p {L &}: regular-expressions.info/unicode.html В последнее время я использовал его в моих собственных скриптах для идентификации буквы на некоторых неевропейских языках, которые не имеют вариантов в верхнем или нижнем регистре и не позволяют мне правильно регистрировать строку (что я делаю в этом скрипте для всех строк, с которыми это можно сделать).
@Lwangaman Спасибо за ссылку и за исправление моего jsfiddle! Я включил ваш код в сценарий и обновил ответ. Сначала я думал, что это что-то более сложное, но поскольку это просто объединение категорий Ll, Lu и Lt, то в этом нет ничего страшного (хотя я все еще не уверен, что это просто Perl / XRegExp, или что-то, что сделает его путь к стандарту EcmaScript 6 - который, надеюсь, скоро появится и сделает мой код устаревшим ...: P).
Это сделает это:
/[A-Za-z\u00C0-\u00FF ]+/.exec('hipopótamo maçã pólen ñ poção água língüa')
Он явно выбирает диапазон символов Юникода. Он будет работать с латинскими символами, но другие странные символы могут быть за пределами этого диапазона.
Это прекрасно работает. Почему не работает без а-я? Разве это не в том же диапазоне Юникода?
Обратите внимание, что это не охватывает весь диапазон латинского Unicode. Между \u0100 и \u0280 больше: многие из них можно рассматривать как латинские символы, а другие - нет: var s = ''; for (var i = 0xff; i <= 0x280; i ++) {s + = String.fromCharCode (i)} "āĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİı ĺĻļĽľĿŀŁłŃńŅņŇňʼnŊŋŌō Ŏŏ ... ǐǑǒǓǔǕǖǗǘǙǚǛǜǝǞ ǟǠǡǢǣǤǥǦǧǨǩǪǫǬǭǮǯǰDZDz dzǴǵǶǷǸǹǺǻǼǽǾǿȀȁȂȃȄȅȆ ȇȈȉȊȋȌȍȎȏȐȑȒȓȔȕȖȗȘșȚ țȜȝȞȟȠȡȢȣȤȥȦȧȨȩȪȫȬȭȮ ȯȰȱȲȳȴȵȶȷȸȹȺȻȼȽȾȿɀɁɂ ɃɄɅɆɇɈɉɊɋɌɍɎɏɐɑɒɓɔɕɖ ɗɘəɚɛɜɝɞɟɠɡɢɣɤɥɦɧɨɩɪ ɫɬɭɮɯɰɱɲɳɴɵɶɷɸɹɺɻɼɽɾ ɿʀ "
Если вы используете Вавилон, то Поддержка Unicode уже доступен.
Я также выпустил плагин, который преобразует ваш исходный код таким образом, чтобы вы могли писать регулярные выражения, такие как /^\p{L}+$/. Затем они будут преобразованы в то, что понимают браузеры.
Вот страница проекта плагина:
Вавилон-плагин-UTF-8-регулярное выражение
Примечание: плагин не работает с Babel 6.
Лично я бы предпочел не устанавливать другую библиотеку только для того, чтобы получить эту функциональность. Мой ответ не требует каких-либо внешних библиотек, и он также может работать с небольшими изменениями для разновидностей регулярных выражений, помимо JavaScript.
Веб-сайт Unicode предоставляет способ переводить категории Unicode в набор кодовых точек. Поскольку это веб-сайт Юникод, информация с него должна быть точной.
Обратите внимание, что вам нужно будет исключить символы верхнего уровня, поскольку JavaScript может обрабатывать только символы, меньшие, чем FFFF (шестнадцатеричный). Я предлагаю установить флажки Abbreviate Collate и Escape, которые обеспечивают баланс между предотвращением непечатаемых символов и минимизацией размера регулярного выражения.
Вот несколько распространенных расширений различных свойств Unicode:
\p{L} (Буквы):
[A-Za-z\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16F1-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]
\p{Nd} (число десятичных цифр):
[0-9\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0DE6-\u0DEF\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uA9F0-\uA9F9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19]
\p{P} (Пунктуация):
[!-#%-*,-/\:;?@\[-\]_\{\}\u00A1\u00A7\u00AB\u00B6\u00B7\u00BB\u00BF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E42\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]
Страница также распознает ряд малоизвестных классов символов, таких как \p{Hira}, который представляет собой только (японские) символы хираганы:
[\u3041-\u3096\u309D-\u309F]
Наконец, можно подключить класс char с более чем одним свойством Unicode, чтобы получить более короткое регулярное выражение, чем вы получили бы, просто комбинируя их (при условии, что отмечены определенные настройки).
\p-Синтаксис, похоже, не работает в JS, /\p{L}/.test('a') - это false@DmitriZaitsev Конечно, нет. Вам нужно будет использовать «расширение», которое я перечислил ниже.
"Расширение" с горизонтальной полосой прокрутки 1/100 строки? В производственном коде с юнит-тестами? ;)
Возможно, вы могли бы более подробно указать, какие из них работают с JS, а какие нет, для большей ясности.
@DmitriZaitsev Я думаю, что вы здесь упускаете суть, он предоставил набор регулярных выражений, которые все работают в JS. Поскольку они заменяют то, что должно (и будет) быть нативной функциональностью, они обязательно довольно длинные. Как бы вы провели модульное тестирование встроенной функциональности?
@HeyHeyJC На самом деле не все работает в JS, \p не так, как подтверждено в комментарии выше. И вы тестируете не встроенную функцию, а длинное регулярное выражение. Как еще вы можете быть уверены, что все работает так, как ожидалось?
@Laurel юникоды в \ p {L} (буквы), вы говорите, что он работает так же, как \ P {L} в PHP, как все символы на всех языках? Если да, то в пятизначных юникодах отсутствуют символы, которые охватывают алфавитные символы разных языков. Я видел некоторые юникоды, такие как \ u {E007F}, который охватывает 5-значные юникоды.
Спасибо, сэр. Это кажется самым простым решением.
Спасибо за очень подробный пост
Символ Ö не совпадает, когда я использовал ваш пример Unicode \ p {L} (Letters) в моем наборе тестов. Пришлось добавить \ u0308. Я не понимаю, почему существующий код не работал. Не уверен, что то, что я сделал, добавляет побочный эффект.
[^\u0000-\u007F]+ для любых символов, не включенных в символы ASCII.
Например:
function isNonLatinCharacters(s) {
return /[^\u0000-\u007F]/.test(s);
}
console.info(isNonLatinCharacters("身分"));// Japanese
console.info(isNonLatinCharacters("测试"));// Chinese
console.info(isNonLatinCharacters("حمید"));// Persian
console.info(isNonLatinCharacters("테스트"));// Korean
console.info(isNonLatinCharacters("परीक्षण"));// Hindi
console.info(isNonLatinCharacters("מִבְחָן"));// HebrewВот несколько отличных ссылок:
Генератор регулярных выражений диапазона Юникода
Таблицы кодов символов Unicode 10.0
Соответствие диапазону блоков Unicode
Как разрешить это, а также разрешить английский?
Сентябрь 2018 г. (обновлено в феврале 2019 г.)
Кажется, что regexp /\p{L}/u для букв соответствия (как категории юникода)
Вот такой рабочий пример
In below field you should be able to to type letters but not numbers<br>
<input type = "text" name = "field" onkeydown = "return /\p{L}/u.test(event.key)" >Сообщаю об этой ошибке здесь.
По прошествии более 2 лет, согласно: 1500035> 1361876> 1634135, наконец, эта ошибка исправлена и будет доступна в Firefox v.78 +
Вы также можете использовать:
function myFunction() {
var str = "xq234";
var allowChars = "^[a-zA-ZÀ-ÿ]+$";
var res = str.match(allowChars);
if (!str.match(allowChars)){
res = "true";
}
else {
res = "false";
}
document.getElementById("demo").innerHTML = res;
Это не включает поддержку регулярных выражений, но полезно для задач, связанных с Unicode github.com/joelarson4/CharFunk