Я посмотрел на переполнение стека ( замена символов ... например , как JavaScript не соответствует стандарту Unicode относительно RegExp и т. Д.) И не нашел конкретного ответа на вопрос:
How can JavaScript match for accented characters (those with diacritical marks)?
Я заставляю поле в пользовательском интерфейсе соответствовать формату: last_name, first_name
(последнее [пространство запятой] первым) , и я хочу обеспечить поддержку диакритических знаков, но, очевидно, в JavaScript это немного сложнее, чем в других языках / платформах.
Это была моя оригинальная версия, пока я не хотел добавить диакритическую поддержку:
/^[a-zA-Z]+,\s[a-zA-Z]+$/
В настоящее время я обсуждаю один из трех способов добавления поддержки, все из которых я тестировал и работал (по крайней мере, до некоторой степени, я действительно не знаю, какова «степень» второго подхода). Они здесь:
Явный список всех акцентированных символов, которые я хотел бы принять как допустимые (хромые и чрезмерно сложные):
var accentedCharacters = "àèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ";
// Build the full regex
var regex = "^[a-zA-Z" + accentedCharacters + "]+,\\s[a-zA-Z" + accentedCharacters + "]+$";
// Create a RegExp from the string version
regexCompiled = new RegExp(regex);
// regexCompiled = /^[a-zA-ZàèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ]+,\s[a-zA-ZàèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇßØøÅåÆæœ]+$/
- Это правильно сопоставляет фамилию / имя с любым из поддерживаемых акцентированных символов в
accentedCharacters
.
Мой другой подход состоял в том, чтобы использовать .
класс символов, чтобы иметь более простое выражение:
var regex = /^.+,\s.+$/;
- Этот матч будет просто ни о чем, по крайней мере , в виде:
something, something
. Все в порядке, я полагаю ...
Последний подход, который я только что нашел, может быть проще ...
/^[a-zA-Z\u00C0-\u017F]+,\s[a-zA-Z\u00C0-\u017F]+$/
- Он соответствует ряду символов Юникода - проверено и работает, хотя я не пробовал ничего сумасшедшего, только обычные вещи, которые я вижу в нашем языковом отделе для имен преподавателей.
Вот мои проблемы:
- Первое решение слишком ограничивающее, а также неаккуратное и запутанное. Это нужно изменить, если я забуду одного или двух персонажей, и это не очень практично.
- Второе решение лучше, лаконичнее, но, вероятно, соответствует гораздо большему, чем должно быть на самом деле. Я не смог найти никакой реальной документации о том, что именно
.
соответствует, только обобщение «любого символа, кроме символа новой строки» (из таблицы в MDN ). Третье решение кажется наиболее точным, но есть ли ошибки? Я не очень знаком с Unicode, по крайней мере, на практике, но, глядя на кодовую таблицу / продолжение этой таблицы ,
\u00C0-\u017F
кажется довольно солидным, по крайней мере, для моего ожидаемого ввода.- Преподаватели не будут отправлять формы с их именами на родном языке (например, на арабском, китайском, японском и т. Д.), Поэтому мне не нужно беспокоиться о наборах символов, не входящих в латиницу
Таким образом, реальный вопрос (ы) : Какой из этих трех подходов больше всего подходит для этой задачи? Или есть лучшие решения?
источник
regex = /^[^,]+,\s[^,]+$/;
чтобы предотвратить это..
Ответы:
Самый простой способ принять все акценты это:
См. Https://unicode-table.com/en/ для символов, перечисленных в числовом порядке.
источник
-
определяет диапазон, и этот метод использует упорядочение символов в кодировке для определения непрерывного диапазона, что позволяет получить очень краткое решение проблемыZ
иa
)?Акцентированного латинского диапазона
\u00C0-\u017F
было недостаточно для моей базы данных имен, поэтому я расширил регулярное выражение доЯ добавил эти блоки кода (
\u00C0-\u024F
включает три смежных блока одновременно):\u00C0-\u00FF
Приложение Latin-1\u0100-\u017F
Латинская Расширенная-A\u0180-\u024F
Латинская Расширенная-B\u1E00-\u1EFF
Латинская Расширенная ДополнительнаяОбратите внимание, что
\u00C0-\u00FF
на самом деле это только часть дополнения Latin-1 . Этот диапазон пропускает непечатаемые управляющие сигналы и все символы, кроме неуклюжего умножения ×\u00D7
и деления ÷\u00F7
.Если вам нужно больше кодовых точек, вы можете найти больше диапазонов в списке символов Юникода в Википедии . Например, вы также можете добавить Latin Extended-C , D и E , но я их исключил, потому что сейчас их интересуют только историки, а наборы D и E даже неправильно отображаются в моем браузере.
Первоначальное регулярное выражение останавливалось
\u017F
на названии "onenol". Согласно Unicode Analyzer FontSpace , первым символом является\u0218
LATIN CAPITAL LETTER S с запятой ниже. (Да, обычно это пишется с помощью cedilla-S\u015E
, «Шенол». Но я не лечу в Турцию, чтобы сказать ему: «Вы пишете свое имя неправильно!»)источник
[a-zA-Z\u00c0-\u024f\u1e00-\u1eff]
Зависит от задачи :-) Чтобы соответствовать точно всем латинским символам и их акцентированным версиям, диапазоны Unicode, вероятно, обеспечивают лучшее решение. Они могут быть распространены на все непробельные символы, что можно сделать с помощью
\S
класса символов.Самая основная проблема, которую я вижу здесь, это не диакритические знаки, а пробелы. Есть несколько имен, которые состоят из нескольких слов, например, для названий. Таким образом, вы должны пойти с самым общим, то есть разрешить все, кроме запятой, которая отличает имя от фамилии:
Но ваше второе решение с
.
классом символов так же хорошо, вам может понадобиться только несколько запятых.источник
any_character_not_a_comma, any_character_not_a_comma
? Это то, что я подумал, когда впервые прочитал это, я немного растерялся, когда увидел там три запятых.s
...[^\s]
до\S
В библиотеке XRegExp есть плагин с именем Unicode, который помогает решать подобные задачи.
Это упоминается в комментариях к вопросу, но это легко пропустить. Я заметил это только после того, как отправил этот ответ.
источник
anything, anything
. Это будет полезно для будущих читателей :)Как насчет этого?
источник
Šš
.Как насчет этого?
Это будет соответствовать каждому слову с ударением символов или нет.
источник
из этой вики: https://en.wikipedia.org/wiki/List_of_Unicode_characters#Basic_Latin
для латинских букв я использую
избегает дефисов и специальных символов
источник
Объяснение:
\pL
- соответствует любому виду букв на любом языке\pM
- выделяет символ, предназначенный для объединения с другим персонажем (например, акценты, умлауты, заключенные в рамки и т. д.)\p{Zs}
- соответствует символу пробела, который невидим, но занимает местоu
- Шаблонные и предметные строки рассматриваются как UTF-8В отличие от других предложенных регулярных выражений (таких как
[A-Za-zÀ-ÖØ-öø-ÿ]
), это будет работать со всеми символами, специфичными для языка, напримерŠš
, соответствует этому правилу, но не соответствует другим на этой странице.К сожалению, изначально JavaScript не поддерживает эти классы. Тем не менее, вы можете использовать
xregexp
, например,источник
Вы можете удалить диакритические знаки из алфавитов, используя:
Он удалит все диакритические знаки, а затем выполнит ваше регулярное выражение
Ссылка:
https://thread.engineering/2018-08-29-searching-and-sorting-text-with-diacritical-marks-in-javascript/
источник