Я посмотрел на переполнение стека ( замена символов ... например , как 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[^,]+$/;
чтобы предотвратить это.