Java - Regex для полного имени

Как я могу проверить регулярное выражение для полного имени? Мне нужны только алфавиты (без цифр) и только пробелы для регулярного выражения. Это то, что я делал до сих пор. Не могли бы вы помочь мне исправить регулярное выражение? Большое Вам спасибо

public static boolean isFullname(String str) {
    boolean isValid = false;
    String expression = "^[a-zA-Z][ ]*$"; //I know this one is wrong for sure >,<
    CharSequence inputStr = str;
    Pattern pattern = Pattern.compile(expression, Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(inputStr);
    if (matcher.matches()) {
        isValid = true;
    }
    return isValid;
}

person Nicholas Lie    schedule 09.09.2011    source источник
comment
Не делайте предположений относительно имен людей. Период. Не используйте [a-z], когда вам следует использовать [\pL\pM\p{Nl}]. Не забывайте о пунктуации.   -  person tchrist    schedule 09.09.2011
comment
А как насчет людей с такими именами, как Скарлетт О'Хара или Башар аль-Асад?   -  person NullUserException    schedule 09.09.2011
comment
Чтобы процитировать tchrist, код, который считает, что чье-то имя может содержать только определенные символы, глупо, оскорбительно и неправильно.   -  person NullUserException    schedule 09.09.2011
comment
Спасибо большое, Христос. Теперь я понимаю, что мне не следует проверять регулярные выражения для полных имен. Но все же я бы подумал, что даже символы также могут пройти проверку% ^ @ ^ #! @ *   -  person Nicholas Lie    schedule 09.09.2011
comment
stackoverflow.com/questions/2385701 /   -  person BullShark    schedule 31.03.2013


Ответы (6)


Эта проблема идентификации имен очень ориентирована на культуру, и у нее нет никакой надежды на надежную работу. Я бы действительно не рекомендовал это делать, так как нет канонической формы НЕТ для того, что составляет имя человека в любой стране, в любом месте на Земле, о которых я знаю. Я мог бы официально изменить свое имя на #&*∫Ω∆ Smith, и это не укладывается ни в один алгоритм. Дело не в том, что этот конкретный пример - это то, что делают многие люди, но многие люди не думают за пределами таблицы ASCII при рассмотрении ввода данных, и это приведет к проблемам.

Вы можете возразить против вероятности того, что это произойдет, но в глобальном мире все более маловероятно, что ВСЕ ваши пользователи будут использовать английские транслитерированные варианты написания своих имен. Также очень возможно, что у вас будут пользователи из культур, у которых нет концепции имени / фамилии. Не думайте, что даже если ваше приложение работает только в данной стране, некоторые из ваших пользователей не будут из других мест (люди все время переезжают из страны в страну, и некоторые из них могут захотеть использовать вашу программное обеспечение).

Защитите свое приложение от SQL-инъекций для таких полей (если вы храните их в БД) и оставьте все как есть.

person jefflunt    schedule 09.09.2011
comment
... I could legally change my name to #&*∫Ω∆ Smith, and that's not going to fit into anyone's algorithm... как насчет ^.*$ :) - person James Oravec; 28.01.2016

Этот метод проверяет имя и возвращает false, если имя не имеет ничего или содержит числа или специальные символы:

public static boolean isFullname(String str) {
    String expression = "^[a-zA-Z\\s]+"; 
    return str.matches(expression);        
}
person Ahmed El Reweny    schedule 10.02.2014

О чем просили

Вместо "^[a-zA-Z][ ]*$" вы хотите "^[a-zA-Z ]*$". Есть некоторые ответы, которые ссылаются на \s, но они вам не нужны, потому что они дают вам другое пустое пространство, например вкладки.

Дополнительные распространенные примеры

Кстати, есть имена и фамилии, которые содержат дефисы, например Mary-Ann для имени или фамилию через дефис, например Jones-Garcia. Есть также фамилии с точками, например St. Marc. Наконец, у вас есть ' в некоторых фамилиях, например, O'Donnel.

Боковое примечание

По закону вы можете изменить свое имя на Little Bobby Drop Tables ... или включить другие случайные символы ... но я не уверен, сколько систем действительно приспособлено для подобных вещей.

Если вам нужен общий регистр (во всем мире), не ограничивайте поля каким-либо типом символов, так как вы можете иметь имена греческими буквами, кириллическими буквами, китайскими буквами и т.д. как немецкий умляут.

Если вас беспокоит внедрение SQL, используйте параметризованные запросы вместо динамических.

Предлагаемое решение

Если вас беспокоят только английские буквы и вы хотите использовать регулярное выражение, которое обрабатывает приведенные выше примеры случаев, вы можете использовать "^[a-zA-Z \-\.\']*$"

person James Oravec    schedule 28.01.2016

[A-Z] соответствует одной заглавной букве (первая буква имени)

[a-z]* соответствовать любому количеству строчных букв (другие буквы или имя)

(\s) соответствует 1 символу пробела (пробел между именами)

+ одно или несколько из предыдущих выражений (для соответствия более чем одному имени)

все вместе:

- matches first names / lastname -
^([A-Z][a-z]*((\s)))+[A-Z][a-z]*$

или чтобы сопоставить имена, такие как DiMaggio St. Croix, O'Reilly и Le-Pew. Вы можете добавлять похожие символы, такие как 'ᶜ' в MᶜKinley, когда вы их помните или встречаетесь с людьми с менее распространенными символами в их имени.

^([A-z\'\.-ᶜ]*(\s))+[A-z\'\.-ᶜ]*$

person James Webster    schedule 09.09.2011
comment
Джо Ди Маджио может что-то сказать по этому поводу :-) - person paxdiablo; 09.09.2011
comment
@NullUser, поддерживающий отчество. - person James Webster; 09.09.2011
comment
@pax, у мистера ДиМаджио вполне может быть проблема. Я исправлю - person James Webster; 09.09.2011
comment
Почему вы используете ((\s){1}), а не просто \s? - person NullUserException; 09.09.2011
comment
Да, я не был уверен в этом. Я даже упомянул об этом в своем ответе. - person James Webster; 09.09.2011
comment
Не удается на «Pres. Уильям МоКинли » - person tchrist; 09.09.2011
comment
Не удается на «Джоне Поле Джонсе». Неудачи на "Рене Флеминг". Неудачи на «Доминке Стросс-Кане». Неудачи на «Короле Генрихе Ⅷ». Неудачи на «Тиме О'Рейли». Не удается "Секретарь Федерико Пенья". Неудачи на «Мотеле 6». Не получается на "Шер". Провал на «Антонио Сиприано Хосе Мария и Франсиско де Санта Ана Мачадо и Руис». Не удается выполнить сбой не удается - person tchrist; 09.09.2011
comment
Ложно-положительный результат на «___ ^^^ _ ^ \\\\ [[[]] [] [____» ». - person tchrist; 09.09.2011
comment
^ это меня действительно беспокоит ›,‹ но, к сожалению, это правда, что «___ ^^^ _ ^ \\\ [[[]] [] [____» может пройти - person Nicholas Lie; 09.09.2011
comment
(пришел к выводу, что полные имена вообще не могут быть проверены - просто подумал, китайский, русский, японский, арабский и другие юникоды ›,‹) Всем спасибо за просветление :) - person Nicholas Lie; 09.09.2011

public static boolean isFullname(String str) {
    return str.matches("^[a-zA-z ]*$");
}

этот метод возвращает истину, если строка содержит только буквы и пробелы.

Но он также возвращает истину, если строка ничего не содержит.

person Dragon8    schedule 09.09.2011

Используйте \s для пробелов. Вы также можете использовать String.matches(regex), чтобы проверить, соответствует ли строка регулярному выражению.

public static boolean isFullname(String str) {
    String expression = "^[a-zA-Z\\s]*$"; 
    return str.matches(expression);        
}
person dogbane    schedule 09.09.2011
comment
Ложное срабатывание в пустой строке. Ложноотрицательный результат на «Доминке Стросс-Кан». - person tchrist; 09.09.2011
comment
@tchrist Почему ты считаешь, что у каждого есть имя? - person Aillyn; 09.09.2011
comment
Нет необходимости использовать ^ и $ с .matches() - person NullUserException; 09.09.2011
comment
Ложноположительный результат на «\ n \ f \ f \ t». - person tchrist; 09.09.2011