Java - Regex для полного имени - PullRequest
8 голосов
/ 09 сентября 2011

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

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;
}

Ответы [ 6 ]

21 голосов
/ 09 сентября 2011

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

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

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

6 голосов
/ 10 февраля 2014

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

public static boolean isFullname(String str) {
    String expression = "^[a-zA-Z\\s]+"; 
    return str.matches(expression);        
}
1 голос
/ 28 января 2016

Что просили

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

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

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

Примечание на стороне

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

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

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

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

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

1 голос
/ 09 сентября 2011

[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\'\.-ᶜ]*$

0 голосов
/ 09 сентября 2011

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

public static boolean isFullname(String str) {
    String expression = "^[a-zA-Z\\s]*$"; 
    return str.matches(expression);        
}
0 голосов
/ 09 сентября 2011
public static boolean isFullname(String str) {
    return str.matches("^[a-zA-z ]*$");
}

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

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

...