2015-11-25 3 views
0
String getname(){ 

    Scanner input = new Scanner(System.in); 
    String name; 
    System.out.println("Enter your name:"); 
    name= input.next(); 

    String name_pattern = "^[A-Za-z]+(\\s[A-Za-z]+)$";//this regex isnt validating Ben Smith 
    Pattern pattern = Pattern.compile(name_pattern); 
    Matcher regexmatcher = pattern.matcher(name); 

    if(!regexmatcher.matches()){ 
     System.out.println("Name format not correct"); 
    } 

    return name; 

} 

Мне также нужно вводить ввод снова и снова, пока не будет введен правильный формат. Как мне это сделать? Мое текущее регулярное выражение печатает «Формат имени не корректно», когда я вводил «Бен Смит», хотя он не должен печатать, потому что Бен Смит является допустимым вводом!Регулярное выражение для проверки: Имя LastName (например, Ben Smith)

+0

Немного связанные: http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/ – Biffen

+0

На каком языке вы здесь? Это может быть актуально. – Sobrique

+0

@MaryamMasood Вы пробовали отлаживать его? Или, по крайней мере, напечатать 'имя' между вводом и сопоставлением? Что касается «* снова и снова * [...] * Как мне это сделать? * ': Вы слышали о циклах? – Biffen

ответ

-2

^[A-Za-z ]+$ достаточно.

private final static Pattern NAME_VALIDATOR = Pattern.compile("^[A-Za-z ]+$"); 
[...] 
System.out.println(NAME_VALIDATOR.matcher("Ben Smith").matches()); 

Обратите внимание, что шаблон всегда то же самое, так что вы можете просто создать его один раз вместо того, чтобы создавать его каждый раз при входе в метод.

Также обратите внимание, что это не будет проверять имена с ', например. O'Brian, ни иностранные имена, например. Mätthaus. Вместо этого используйте вместо этого \p{L}.


Как комментарий указывает:

«Насколько я понимаю, они хотят только два слова с пространством Inbetween быть действительным»

Тогда регулярное выражение будет "^[A-Za-z]+ [A-Za-z]+$".

+3

Я не думаю, что делает то, что хочет OP.Насколько я понимаю, они хотят, чтобы только два слова с промежутком между ними были действительными (что является глупым требованием для имени, но это уже другая история). – Biffen

+2

Это также соответствует «B e n S m i t h», хотя OP может не понравиться – Aaron

+0

@Biffen Я обновил свой ответ – m0skit0

4

input.next возвращает следующий токен со входа, а не следующей строки. Вы можете установить другой разделитель в сканере для возврата строки, но самые пользовательский способ заключается в использовании

name= input.nextLine(); 
+1

Может быть, 'input.next (pattern)' будет более уместным? Проверка правильности паттерна может быть выполнена с помощью 'input.hasNext (pattern)', после чего очень мало ввода с '! Input.hasNext()' Я думаю. – Aaron

+2

здесь, как мы разделим текст (строка за строкой), и то, что мы ожидали прочитать (рисунок), - совершенно несвязанные вещи, и если мы попытаемся объединить их таким образом, нам придется подумать, что делать, если мы есть что-то еще на входе и как пропустить его в этом случае. –

+0

Должен ли я добавить это в мой цикл while? –

1

метод сканер next() возвращает только следующее слово, в вашем случае «Бен». Замените это на nextLine(), чтобы получить полное имя.

Scanner input = new Scanner(System.in); 
String name; 
System.out.println("Enter your name:"); 
name = input.nextLine(); 

При этом ваше регулярное выражение соответствует «Бен Смит».

+0

input.nextLine() работал! Благодаря! –

Смежные вопросы