Регулярные выражения JavaScript + Unicode

Как я могу использовать в JavaScript регулярные выражения с поддержкой Unicode?

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

Это не включает поддержку регулярных выражений, но полезно для задач, связанных с Unicode github.com/joelarson4/CharFunk

jwl 23.03.2013 20:19
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
228
1
141 785
10

Ответы 10

Ситуация для ES 6

Предстоящая спецификация языка ECMAScript, издание 6, включает регулярные выражения, поддерживающие Unicode. Поддержка должна быть включена с помощью модификатора u в регулярном выражении. См. Регулярные выражения с поддержкой Unicode в ES6.

Однако до тех пор, пока ES 6 не будет завершен и широко распространен среди поставщиков браузеров, вы все еще сами по себе. Обновлять: Теперь существует транспилятор с именем регулярное выражение, который переводит регулярные выражения Unicode ES6 в эквивалентные ES5. Его можно использовать как часть процесса сборки. Попробуйте онлайн.

Ситуация для ES 5 и ниже

Несмотря на то, что JavaScript работает со строками Unicode, он не реализует классы символов, поддерживающие Unicode, и не имеет концепции классов символов POSIX или блоков / поддиапазонов Unicode.

Этот последний инструмент отлично подходит для блоков, но мало что дает, когда вам нужны типы символов, разбросанные по множеству блоков (например, буквы или цифры). См. это для аналогичного подхода для этого случая.

mgibsonbr 02.02.2012 02:09
6to5 и следопыт также служба поддержки флаг u, а также некоторые другие Особенности ES6 для работы с Unicode.
Useless Code 24.01.2015 03:09

@UselessCode Да, Babel и Traceur используют регулярное выражение как зависимость для транспиляции этих регулярных выражений u.

Mathias Bynens 10.06.2016 11:07

Если вам нужны классы символов Юникода, такие как \ pL, и поддержка старых браузеров, то библиотека XRegExp (см. Там собственный флаг A) определенно будет оптимальным решением. Спасибо!

BurninLeo 25.11.2016 14:10

К сожалению, онлайн-транспилятор не работал у меня, используя \ w с китайскими иероглифами. Пытался транспилировать "a品cd!e f".replace(/[^\w]/ug, ""), но полученное регулярное выражение (запущенное в Chrome 59) по-прежнему удаляет символ и возвращает только "acdef"

mwag 07.07.2017 23:02

@mwag ES6 по-прежнему не используется в браузерах по умолчанию. Задайте, пожалуйста, отдельный вопрос, у вас уже есть все необходимые детали. Если возможно, дайте ссылку на ответ здесь, чтобы я мог обновить этот пост.

Tomalak 07.07.2017 23:43

@Tomalak Я не пытался запускать ES6, а скорее ES5, поэтому я попробовал транспилер. "a品cd!e f".replace(/[^\w]/ug, "") преобразуется в ES5 "a品cd!e f".replace(/(?:[\0-/:-@\[-\^`\{-\uD7FF\uE000-\uFFFF]|[\uD800‌​-\uDBFF][\uDC00-\uDF‌​FF]|[\uD800-\uDBFF](‌​?![\uDC00-\uDFFF])|(‌​?:[^\uD800-\uDBFF]|^‌​)[\uDC00-\uDFFF])/g, ""), что приводит к неверному результату "acdef"

mwag 07.07.2017 23:47

Отличный материал для отдельного вопроса. Вы сделали всю домашнюю работу. Пока я использую мобильный телефон, я могу только писать комментарии. Пожалуйста, откройте отдельную тему.

Tomalak 08.07.2017 00:03

Просто говорю, никогда не используйте \w, он имеет другое значение в зависимости от локали env. Предпочитать \\pL из библиотеки XRegExp

Antoine 24.07.2017 16:02

Вы имеете в виду атрибут проверки ввода в полях формы? Он использует то же регулярное выражение, что и встроенный в JS-движок данного браузера, и компилируется с отключенными флагами (увидеть этот ответ). Я предполагаю, что это будет включать флаг u, даже если бы он поддерживался, но я не уверен на 100%. Было бы неплохо задать здесь отдельный вопрос, хотя вы легко можете выяснить это экспериментально.

Tomalak 07.10.2019 09:13

В 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. Вы можете использовать их в диапазонах классов символов.

Почему? почему столько боли?

jeremy-george 25.03.2014 03:57

Он поддерживается в Node 12. Но нужно добавить модификатор u: /\p{L}+/u.

Ilya Semenov 28.10.2019 11:01

Как упоминалось в других ответах, регулярные выражения JavaScript не поддерживают классы символов Unicode. Однако есть библиотека, которая это обеспечивает: превосходные XRegExp Стивена Левитана и его Плагин Unicode.

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

mustaccio 07.06.2016 02:39

@mustaccio: Я не согласен. Этот ответ рекомендует использовать библиотеку. Если библиотека уходит, ответ, дублирующий снимок документации библиотеки, так же бесполезен, как и ответ, который просто ссылается на библиотеку.

Tim Down 07.06.2016 19:50

Также не найдя хорошего решения, я давно написал небольшой сценарий, загрузив данные из юникода Спецификация (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}+$/ должен соответствовать 東海林, но это не так. Когда вы обновляете коллекцию, пожалуйста, сообщайте мне. Большое спасибо.

Martin Braun 01.05.2014 23:57

Хорошо, это просто. Тайваньский, китайский и японский языки используют эту таблицу юникода: rikai.com/library/kanjitables/kanji_codes.unicode.shtml Хотя у вас есть таблица катакана в \p{Lo}, вы упускаете обе таблицы кандзи в ней.

Martin Braun 02.05.2014 01:13

@modiX Спасибо, что указали на это! Я обновил сценарий, на этот раз используя Java, до создать список - вместо того, чтобы удалять их из файлов Unicode. Я планирую добавить поддержку SMP, если это возможно.

mgibsonbr 04.05.2014 13:04

Спасибо за это. Уии, глядя на дополнительный многоязычный уровень юникода, есть еще много того, что нужно сделать, я не знал, что это еще не включено. Пожалуйста, информируйте меня, когда добавляете их в вашу текущую программу Java (вывод).

Martin Braun 05.05.2014 13:53

@modiX К сожалению, я обнаружил, что регулярные выражения JavaScript не могут обрабатывать интервалы между символами вне BMP (пример). Поскольку это ключевой момент в моей реализации, это означает, что я никогда не смогу добавить надлежащую поддержку SMP! :( Таким образом, мое решение пока ограничено BMP, будем надеяться, что EcmaScript 6 улучшит ситуацию ...

mgibsonbr 06.05.2014 13:43

похоже на удобный скрипт, как вы думаете, можно ли добавить к нему модификатор "\ p {L &}"? Он должен соответствовать любому символу, имеющему соответствующий аналог в верхнем или нижнем регистре.

JohnRDOrazio 10.01.2015 19:42

@Lwangaman Думаю, я мог бы, но это стандарт? Никогда раньше не видел ... У вас есть ссылки, на которые я могу взглянуть (независимо от языка)?

mgibsonbr 10.01.2015 20:41

Я добавил его в пример JSFiddle (и получил ul и li для правильного рендеринга): jsfiddle.net/Waxkc/49 Здесь вы можете найти ссылку на модификатор \ p {L &}: regular-expressions.info/unicode.html В последнее время я использовал его в моих собственных скриптах для идентификации буквы на некоторых неевропейских языках, которые не имеют вариантов в верхнем или нижнем регистре и не позволяют мне правильно регистрировать строку (что я делаю в этом скрипте для всех строк, с которыми это можно сделать).

JohnRDOrazio 10.01.2015 23:28

@Lwangaman Спасибо за ссылку и за исправление моего jsfiddle! Я включил ваш код в сценарий и обновил ответ. Сначала я думал, что это что-то более сложное, но поскольку это просто объединение категорий Ll, Lu и Lt, то в этом нет ничего страшного (хотя я все еще не уверен, что это просто Perl / XRegExp, или что-то, что сделает его путь к стандарту EcmaScript 6 - который, надеюсь, скоро появится и сделает мой код устаревшим ...: P).

mgibsonbr 11.01.2015 00:37

Это сделает это:

/[A-Za-z\u00C0-\u00FF ]+/.exec('hipopótamo maçã pólen ñ poção água língüa')

Он явно выбирает диапазон символов Юникода. Он будет работать с латинскими символами, но другие странные символы могут быть за пределами этого диапазона.

Это прекрасно работает. Почему не работает без а-я? Разве это не в том же диапазоне Юникода?

Jens Törnell 26.10.2016 15:06

Обратите внимание, что это не охватывает весь диапазон латинского Unicode. Между \u0100 и \u0280 больше: многие из них можно рассматривать как латинские символы, а другие - нет: var s = ''; for (var i = 0xff; i <= 0x280; i ++) {s + = String.fromCharCode (i)} "āĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİı ĺĻļĽľĿŀŁłŃńŅņŇňʼnŊŋŌō‌ Ŏŏ ... ǐǑǒǓǔǕǖǗǘǙǚǛǜǝǞ‌ ǟǠǡǢǣǤǥǦǧǨǩǪǫǬǭǮǯǰDZDz‌ dzǴǵǶǷǸǹǺǻǼǽǾǿȀȁȂȃȄȅȆ‌ ȇȈȉȊȋȌȍȎȏȐȑȒȓȔȕȖȗȘșȚ‌ țȜȝȞȟȠȡȢȣȤȥȦȧȨȩȪȫȬȭȮ‌ ȯȰȱȲȳȴȵȶȷȸȹȺȻȼȽȾȿɀɁɂ‌ ɃɄɅɆɇɈɉɊɋɌɍɎɏɐɑɒɓɔɕɖ‌ ɗɘəɚɛɜɝɞɟɠɡɢɣɤɥɦɧɨɩɪ‌ ɫɬɭɮɯɰɱɲɳɴɵɶɷɸɹɺɻɼɽɾ‌ ɿʀ "

David Avsajanishvili 25.08.2017 01:48

Если вы используете Вавилон, то Поддержка Unicode уже доступен.

Я также выпустил плагин, который преобразует ваш исходный код таким образом, чтобы вы могли писать регулярные выражения, такие как /^\p{L}+$/. Затем они будут преобразованы в то, что понимают браузеры.

Вот страница проекта плагина:

Вавилон-плагин-UTF-8-регулярное выражение

Примечание: плагин не работает с Babel 6.

mik01aj 07.09.2016 12:09

Лично я бы предпочел не устанавливать другую библиотеку только для того, чтобы получить эту функциональность. Мой ответ не требует каких-либо внешних библиотек, и он также может работать с небольшими изменениями для разновидностей регулярных выражений, помимо 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
Dmitri Zaitsev 18.04.2017 10:26

@DmitriZaitsev Конечно, нет. Вам нужно будет использовать «расширение», которое я перечислил ниже.

Laurel 18.04.2017 18:16

"Расширение" с горизонтальной полосой прокрутки 1/100 строки? В производственном коде с юнит-тестами? ;)

Dmitri Zaitsev 18.04.2017 19:55

Возможно, вы могли бы более подробно указать, какие из них работают с JS, а какие нет, для большей ясности.

Dmitri Zaitsev 18.04.2017 19:59

@DmitriZaitsev Я думаю, что вы здесь упускаете суть, он предоставил набор регулярных выражений, которые все работают в JS. Поскольку они заменяют то, что должно (и будет) быть нативной функциональностью, они обязательно довольно длинные. Как бы вы провели модульное тестирование встроенной функциональности?

HeyHeyJC 04.05.2017 02:15

@HeyHeyJC На самом деле не все работает в JS, \p не так, как подтверждено в комментарии выше. И вы тестируете не встроенную функцию, а длинное регулярное выражение. Как еще вы можете быть уверены, что все работает так, как ожидалось?

Dmitri Zaitsev 04.05.2017 07:34

@Laurel юникоды в \ p {L} (буквы), вы говорите, что он работает так же, как \ P {L} в PHP, как все символы на всех языках? Если да, то в пятизначных юникодах отсутствуют символы, которые охватывают алфавитные символы разных языков. Я видел некоторые юникоды, такие как \ u {E007F}, который охватывает 5-значные юникоды.

Labeo 06.06.2017 11:54

Спасибо, сэр. Это кажется самым простым решением.

Learner 23.10.2018 07:20

Спасибо за очень подробный пост

BCh 23.08.2019 17:45

Символ Ö не совпадает, когда я использовал ваш пример Unicode \ p {L} (Letters) в моем наборе тестов. Пришлось добавить \ u0308. Я не понимаю, почему существующий код не работал. Не уверен, что то, что я сделал, добавляет побочный эффект.

Learner 24.10.2020 16:30

[^\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

Как разрешить это, а также разрешить английский?

Raz 17.10.2018 16:37

Сентябрь 2018 г. (обновлено в феврале 2019 г.)

Кажется, что regexp /\p{L}/u для букв соответствия (как категории юникода)

  • работает на Хром 68.0.3440.106 и Сафари 11.1.2 (13605.3.8)
  • НЕ работает в Firefox 65.0 :(

Вот такой рабочий пример

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;

Другие вопросы по теме