Вам нужно подбирать строчные и прописные буквы отдельно. В настоящее время ваш диапазон À-ž
для европейских букв включает все строчные и прописные буквы, а также некоторые не-буквы.
Вот диапазоны, которые вам нужны:
Прописные (основной европейский)
- Базовая латиница - прописные буквы латинского алфавита:
[A-Z]
- Дополнение по латинице 1 - Буквы - Прописные буквы:
[À-ÖØ-Þ]
- Расширенная латиница A - Европейская латиница - Прописные буквы:
[ĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJijĴĶĹĻĽĿŁŃŅŇŊŌŎŐŒœŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽ]
Строчные (базовый европейский)
- Базовая латиница - строчные латинские буквы:
[a-z]
- Latin 1 Дополнение - Буквенные символы - строчные буквы:
[ß-öø-ÿ]
- Латинская расширенная A - Европейская латиница - Строчные буквы:
[žſāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıĵķĸĺļľŀłńņňŋōŏőŕŗřśŝşšţťŧũūŭůűųŵŷźż]
Нужный вам шаблон:
/^[UPPER][lower]+(?:[\s'-][UPPER][lower]+)*$/
, где UPPER
и lower
- диапазоны / наборы прописных и строчных букв.
Итак, давайте построим шаблон.
var upper = '[A-ZÀ-ÖØ-ÞĀĂĄĆĈĊČĎĐĒĔĖĘĚĜĞĠĢĤĦĨĪĬĮİIJijĴĶĹĻĽĿŁŃŅŇŊŌŎŐŒœŔŖŘŚŜŞŠŢŤŦŨŪŬŮŰŲŴŶŸŹŻŽ]';
var lower = '[a-zß-öø-ÿžſāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıĵķĸĺļľŀłńņňŋōŏőŕŗřśŝşšţťŧũūŭůűųŵŷźż]';
var rx = new RegExp("^" + upper + lower + "+(?:[\\s'-]" + upper + lower + "+)*$");
// Let's test
var tests = ['Test ','Test - ','Test-',' test','Test-test','TTest','Test\'test','Test','Test-Test','Test Test','Test\'Test', 'Łóźćż\'żłóźćęą'];
for (var s of tests) {
console.log(s, '=>', rx.test(s))
}
ПРИМЕЧАНИЕ есть еще буквы, которые можно использовать на европейских языках. Для получения дополнительной информации см. Unicode Utilities для справки.
ПРИМЕЧАНИЕ 2 : если вы планируете поддерживать только Chrome и другие совместимые с ECMAScript 2018 браузеры, вы можете использовать
console.log( // ONLY WORKS IN ECMASCRIPT 2018 COMPATIBLE JS ENVIRONMENTS
/^\p{Lu}\p{Ll}+(?:[\s'-]\p{Lu}\p{Ll}+)*$/u.test("Test'Ťĕśţ")
);
Java-определение:
String pattern = "(?U)^\\p{Lu}\\p{Ll}+(?:[\\s'-]\\p{Lu}\\p{Ll}+)*$";
Если вы используете его в методе Java matches()
, удалите ^
и $
, поскольку они там избыточны.