Какой самый простой способ сопоставления не-ASCII символов в регулярном выражении? Я хотел бы сопоставить все слова по отдельности во входной строке, но язык может быть не английским, поэтому мне нужно сопоставить такие вещи, как ü, ö, ß и ñ. Кроме того, это в Javascript / jQuery, поэтому любое решение должно быть применимо к этому.
javascript
jquery
regex
Пол Уикс
источник
источник
all words
это звучит так, будто вам нужны только неанглийские буквы, а не все неанглийские символы, как указано в заголовке вопроса.Ответы:
Это должно сделать это:
Он соответствует любому символу, который не содержится в наборе символов ASCII (0-127, то есть от 0x0 до 0x7F).
Вы можете сделать то же самое с Unicode:
Для юникода вы можете посмотреть на следующие 2 ресурса:
источник
[\u00BF-\u1FFF\u2C00-\uD7FF\w]
как письмо.[\u00C0-\u1FFF\u2C00-\uD7FF\w]
(без перевернутого знака вопроса¿
), что касается диапазонов, обратитесь к BMP .00C0
находитсяÀ
в дополнении Latin-1 ,1FFF
является последним символом расширенного греческого2C00
алфавита , является первой буквой в глаголице иD7FF
является последним символом в расширенном тексте Hangul Jamo-B. Так что это все, кроме: символы и специальные символы на 2 первых блоках; символы в средних блоках; суррогаты, приват области и специальные символы в концевых блоках.Это регулярное выражение будет соответствовать всем словам в тексте любого языка ...
источник
[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]
Ситуация с регулярными выражениями, Unicode и Javascript отстой. Смешно, что программистам приходится полагаться на внешние библиотеки, чтобы признать, что «φλφα» - это слово или даже «é» - это буква.
Но так оно и есть.
Этот парень написал хорошую библиотеку для обработки Unicode в регулярных выражениях Javascript:
http://blog.stevenlevithan.com/archives/javascript-regex-and-unicode
Unicode - это плагин для этой библиотеки регулярных выражений:
http://xregexp.com/
Вот пост о расширении Unicode:
http://blog.stevenlevithan.com/archives/xregexp-unicode-plugin
И сама страница расширения:
http://xregexp.com/plugins/
Отличная работа, но все же меня раздражает, что Javascript настолько отстал в этом отношении.
(Он написал книгу для О'Рейли на эту тему, поэтому вполне возможно, что он знает, о чем говорит.)
Он реализовал это путем добавления таблиц символов с определенными свойствами. Затем, когда вы создаете регулярное выражение с его библиотекой,
\p{charclass}
заменяется на[allthecharactersintheclass]
.источник
Unicode Property Escape - одна из особенностей ES2018.
Основное использование
С помощью Eices Property Unicode вы можете сопоставить букву любого языка со следующим простым регулярным выражением:
Или с сокращением, даже более кратким:
Соответствующие слова
Что касается конкретного варианта использования вопроса (сопоставления слов), обратите внимание, что вы можете использовать Eices Property Unicode в классах символов, что позволяет легко сопоставлять буквы вместе с другими символами слов, такими как дефисы:
Собрав все воедино, вы можете сопоставить слова всех [1] языков с этим красиво коротким RegEx:
Пример (бесстыдно подключен из ответа выше ):
Поддержка браузера
На данный момент (декабрь 2018 года) я мог успешно тестировать это регулярное выражение только в Chrome (и других браузерах на основе Blink, таких как Opera, Vivaldi или будущие версии Microsoft Edge) и Safari (по состоянию на версию 12, более ранние тесты с версией 11). не смогли). Однако, поскольку спецификация закончена, а функция стандартизирована, ожидайте, что скоро появятся другие современные браузеры.
Я сделал небольшой сайт для вас, чтобы проверить, поддерживает ли ваш браузер Unicode Property Escape.
Transpiling
Свойство Unicode Escape может быть перенесено на ES5 с помощью инструмента regexpu . Там в онлайн демо доступны здесь . Как вы можете видеть в демонстрации, сегодня вы можете сопоставить нелатинские буквы со следующим (ужасно длинным) регулярным выражением ES5:
Если вы используете Бабель, есть также regexpu питания плагин для этого ( Babel v6 плагина , Бабель v7 плагина ).
источник
u
флаг был введен в ES2015 и позволяет использовать различные функции, связанные с Unicode (например, свойство выходит за пределы, упомянутое в моем ответе, даже если оно было введено только пару лет спустя). Поскольку функции, связанные с Unicode, слегка меняют семантику некоторых шаблонов регулярных выражений, это необходимо явно включить - добавив этотu
флаг.Ответ Джереми Рутена великолепен, но я думаю, что это не совсем то, что искал Пол Уикс. Если я правильно понимаю, Павел спрашивал, чтобы выражение соответствовало неанглийским словам типа
können
илиmóc
. Регулярное выражение Джереми соответствует только неанглийским буквам, поэтому есть необходимость в небольшом улучшении:или
Эта
[^\x00-\x7F]
и эта[^\u0000-\u007F]
части позволяют регулярному выражению соответствовать неанглийским буквам.Это
(|)
логично или и\w
является английской буквой, поэтому([^\u0000-\u007F]|\w)
будет соответствовать одной английской или не английской букве.+
в конце выражения означает, что его можно повторить, поэтому все выражение позволяет сопоставить все английские или неанглийские буквы.Здесь вы можете проверить первое выражение с различными строками, а вот второе.
источник
Вы делаете то же самое, что и любое другое сопоставление символов, но используете \ uXXXX, где XXXX - это номер Unicode символа.
Посмотрите на: http://unicode.org/charts/charindex.html
http://unicode.org/charts/
http://www.decodeunicode.org/
источник
Все разновидности Regex с поддержкой Unicode должны иметь специальный символьный класс, такой как \ w, который соответствует любой букве Unicode. Посмотрите на ваш специфический вкус здесь .
источник
У меня была проблема с \ p, работавшим, как и ожидалось, поэтому я просто использовал другую стратегию, такую как:
Найдите что-нибудь, что не является символом табуляции до следующего символа табуляции ... очевидно, это зависит от вашего источника поиска, но вы поняли идею. Теперь мне не нужно выяснять, какие символы Юникода работают и не работают и т. Д.
источник