Java 用于验证的正则表达式:Firstname LastName(例如Ben Smith)

Java 用于验证的正则表达式:Firstname LastName(例如Ben Smith),java,regex,Java,Regex,我还需要一次又一次地输入,直到输入正确的格式。我该怎么做?当我输入“Ben Smith”时,我当前的正则表达式打印“Name format not correct”,尽管它不应该打印,因为Ben Smith是一个有效的输入 ^[A-Za-z]+$就足够了 String getname(){ Scanner input = new Scanner(System.in); String name; System.out.println("Enter your name:")

我还需要一次又一次地输入,直到输入正确的格式。我该怎么做?当我输入“Ben Smith”时,我当前的正则表达式打印“Name format not correct”,尽管它不应该打印,因为Ben Smith是一个有效的输入

^[A-Za-z]+$
就足够了

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;

}
请注意,模式总是相同的,因此您可以只创建一次,而不是每次输入该方法时都创建一次

还要注意的是,这将不会验证带有
的名称,例如
O'Brian
,也不会验证外来名称,例如
Mätthaus
。考虑使用<代码> \p{L}。


有评论指出:

“据我所知,他们只想要两个带空格的单词 中间有效“


然后正则表达式将改为“
”^[A-Za-z]+[A-Za-z]+$”

^[A-Za-z]+$
就足够了

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;

}
请注意,模式总是相同的,因此您可以只创建一次,而不是每次输入该方法时都创建一次

还要注意的是,这将不会验证带有
的名称,例如
O'Brian
,也不会验证外来名称,例如
Mätthaus
。考虑使用<代码> \p{L}。


有评论指出:

“据我所知,他们只想要两个带空格的单词 中间有效“


然后正则表达式将改为“
”^[A-Za-z]+[A-Za-z]+$”

输入。next
从输入返回下一个标记,而不是下一行。您可以在扫描仪中设置另一个分隔符以返回行,但最常用的方法是使用

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

input.next
从输入返回下一个标记,而不是下一行。您可以在扫描仪中设置另一个分隔符以返回行,但最常用的方法是使用

private final static Pattern NAME_VALIDATOR = Pattern.compile("^[A-Za-z ]+$");
[...]
System.out.println(NAME_VALIDATOR.matcher("Ben Smith").matches());
扫描器的
next()
方法只返回下一个单词,如“Ben”。将其替换为
nextLine()
,以获得完整的名称

name= input.nextLine();
因此,正则表达式与“Ben Smith”匹配。

扫描器的
next()
方法只返回下一个单词,在本例中为“Ben”。将其替换为
nextLine()
,以获得完整的名称

name= input.nextLine();


因此,正则表达式与“Ben Smith”匹配。

有些关联:您在这里使用的是哪种语言?这可能有关系。@MaryamMasood你试过调试它吗?或者至少在输入和匹配之间打印
name
?至于“一次又一次[…]我该怎么做?”:你听说过循环吗?小提示最好用
\w
代替
[a-zA-Z]
为什么你的测试中有括号?你没有使用它们,所以在你让它工作之前把它们删除。有点关联:你在这里使用哪种语言?这可能有关系。@MaryamMasood你试过调试它吗?或者至少在输入和匹配之间打印
name
?至于“一次又一次[…]我该怎么做?”:你听说过循环吗?小提示最好用
\w
代替
[a-zA-Z]
为什么你的测试中有括号?你没有使用它们,所以在你让它工作之前把它们移除。不过我不认为这是OP想要的。据我所知,他们只希望两个中间有空格的单词是有效的(这是一个愚蠢的名字要求,但这是另一个故事)。这也会匹配“be n s m I t h”,而OP可能不会like@m0skit0新的正则表达式与OP非常接近。也许解释一下(细微的)差异会更好?否则,如果你问我的话,这不是一个很好的答案。@m0skit0“^[A-Za-z]+[A-Za-z]+$”正则表达式仍然在ben上打印名称格式不正确smith@MaryamMasood正则表达式正确匹配
“Ben Smith”字符串
。你的问题是你的输入读数,而不是你的正则表达式。请看安德烈·舍尔巴科夫的回答。不过,我认为这并不是OP想要的。据我所知,他们只希望两个中间有空格的单词是有效的(这是一个愚蠢的名字要求,但这是另一个故事)。这也会匹配“be n s m I t h”,而OP可能不会like@m0skit0新的正则表达式与OP非常接近。也许解释一下(细微的)差异会更好?否则,如果你问我的话,这不是一个很好的答案。@m0skit0“^[A-Za-z]+[A-Za-z]+$”正则表达式仍然在ben上打印名称格式不正确smith@MaryamMasood正则表达式正确匹配
“Ben Smith”字符串
。你的问题是你的输入读数,而不是你的正则表达式。请参阅AndreyS Scherbakov的答案。也许
输入。下一步(模式)
更合适?模式验证可以通过
输入来完成。hasNext(模式)
然后确保没有更多的
输入!input.hasNext()
我猜。在这里,我们如何界定文本(一行一行)和我们期望阅读的内容(模式)是完全不相关的事情,如果我们试图以这种方式组合它们,我们将不得不考虑如果输入中还有其他内容,我们该怎么做,以及在这种情况下如何跳过它。我应该在while循环中添加此内容吗?是的,只需将
next
更改为
nextLine
,然后将答案标记为正确,欢迎使用StackOverflow。也许
input。next(模式)
更合适?模式验证可以通过
输入来完成。hasNext(模式)
然后确保没有更多的
输入!input.hasNext()
我猜。在这里,我们如何界定文本(一行一行)和我们期望阅读的内容(模式)是完全不相关的事情,如果我们试图以这种方式组合它们,我们将不得不考虑如果输入中还有其他内容,我们该怎么做,以及在这种情况下如何跳过它。我应该在while循环中添加此内容吗?是的,只需将
next
更改为
nextLine
,然后将答案标记为正确,欢迎使用StackOverflow。