Я посмотрел на Qaru (замену символов.. eh, как 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
кажется довольно прочным, по крайней мере, для ожидаемого ввода.- Факультет не будет подавать формы с их именами на своем родном языке (например, на арабском, китайском, японском и т.д.), поэтому мне не нужно беспокоиться о символах с символами, отличными от латиницы
Итак, реальный вопрос (ы): Какой из этих трех подходов наиболее подходит для задачи? Или есть лучшие решения?