0

通过问题输入报告所有者的名字作为字符串。

需要一个正则表达式来有条件地检查,以确保名字不包含任何数字字符,介于 0 到 9 之间的数字。如果包含,则必须删除它。名字也不能包含任何空格。

    do
    {
        System.out.println("Please enter your FIRST name:");
        firstName = keyboard.next();
        firstName= firstName.toUpperCase();
    }

    while( !firstName.matches("^/s^[a-zA-Z]+$/s"));

    System.out.println("Thanks " + firstName);

Output
p
Please enter your FIRST name:
p p
Please enter your FIRST name:
Please enter your FIRST name:
4

6 回答 6

3

你把你的正则表达式弄糊涂了。试试这个:

while(!firstName.matches("^[^\\d\\s]+$"));

正则表达式的"^[^\\d\\s]+$"意思是“非数字或空格,以及至少一个字符”

于 2012-07-14T05:52:31.890 回答
0

如果要消除数字,只需强制:

\D*

在你的匹配器中

于 2012-07-14T05:16:14.527 回答
0

试试这个:^[a-zA-Z,.'-]+$。:D

此外,如果你想尝试你的正则表达式,rubular.com是一个很好的地方:D

您使用了 Scanner#next,而不是 Scanner#nextLine。

来自 Scanner#next JavaDoc:

从此扫描器中查找并返回下一个完整的令牌。一个完整的标记前后是匹配分隔符模式的输入。

我相信这样一个分隔符是\s+:D

import java.util.Scanner;

public class FirstNameParser {

    public static void main(String[] args) {
        Scanner keyboard = new Scanner(System.in);
        String firstName = null;

        do {
            System.out.print("Please enter your FIRST name: ");
            firstName = keyboard.nextLine();
            firstName = firstName.toUpperCase();
        }

        while (!firstName.matches("^[a-zA-Z,.'-]+$"));

        System.out.println("Thanks " + firstName);

    }
}
于 2012-07-14T05:36:34.990 回答
0

正如你firstname在大写和matches方法中匹配整个输入, [A-Z]+就足够了。

while( !firstName.matches("[A-Z]+"));

或者

while( !firstName.matches("\\p{Lu}+"));
于 2012-07-14T05:56:53.043 回答
0

尝试

firstName =  firstName.replaceAll("[\\d\\s]", "").toUpperCase();
于 2012-07-14T11:57:17.420 回答
0

你可以试试这个。使用Rubular.com创建它。这

Pattern nameRequirment = Pattern.compile("^((?!.[\\d\\s]).)*$");

while (!nameRequirement.matcher(myString).matches()){
  //... prompt for new name
}
于 2013-04-23T15:16:31.810 回答