匹配字符串中的某些单词和字符

时间:2016-09-16 06:57:43

标签: java

今晚第二次再次问好!我正在尝试创建一个错误消息,如果字符串的输入不包含单词/字符:是,是,否,否,Y,y,N,n;并循环返回以获得正确的输入。任何建议都非常感谢! :)

do{ 

addAnother = JOptionPane.showInputDialog("Would you like to enter another salespersons' data?");

if (!addAnother.matches("[YesYESNonoYyNn]"))
    System.out.println("Valid answers: Yes, YES, No, no, Y, y, N, n");
}
while (addAnother.matches("[YesYESNonoYyNn]"));

2 个答案:

答案 0 :(得分:2)

不要为此使用正则表达式。设置一个常量,使HashSet中的所有字符串都匹配并使用contains

因此,除了所有课程方法之外,您还有

private static final Set<String> validOptions = new HashSet<>(Arrays.asList("Yes", "YES", "No", "no", "Y", "y", "N", "n"));

要验证,您只需

while (true) {
    addAnother = JOptionPane.showInputDialog("Would you like to enter another salespersons' data?");

    if (validOptions.contains(addAnother)) {
        break;
    }

    System.out.println("Not a valid option");
}

<强>更新

当然,有很多方法可以改进。 @blackpen在评论中提出了一对夫妇。一种非常好的方法是将所有这些分解为一个单独的方法,并实际返回true或false以指示用户是否对问题回答是或否。所以你的班级可能包括所有这些。

public class GregsFunkyClass {

    private static final Map<String,Boolean> validOptions = new HashMap<>();
    static {
        validOptions.put("yes", true);
        validOptions.put("y", true);
        validOptions.put("no", false);
        validOptions.put("n", false);
    }

    private boolean shouldEnterMoreData() {
        while (true) {
            String input = JOptionPane.showInputDialog("Would you like to enter another salespersons' data?");
            boolean toReturn = validOptions.get(input.trim().toLowerCase());
            if (toReturn != null) {
                return toReturn;
            }
            System.out.println("Not a valid option");
        } 
    }
}

然后你可以从你班上的其他方法调用这个方法,实际得到你想要的答案。在这里,trim()调用会删除前导和尾随空格,而toLowerCase()调用会使大小写或大写输入与我们实际放入地图中的值相匹配。

注意 - 您正在做一些有点奇怪的事情,将控制台输出与GUI输入混合在一起。通常,应用程序是GUI或控制台应用程序,但不是混合应用程序。如果用户键入错误的选项,您可能希望在wee弹出窗口中而不是在控制台上实际输出错误消息。我在这里没有这样做,但希望你明白了。

答案 1 :(得分:0)

除了@ David的好答案,以防万一,如果你仍然想使用正则表达式(效率低下?),你也可以这样做:

public class Main {

     public static boolean isYes(String str) {
        String s1=str.trim();
        return(s1.matches("(?i:^((yes)|(y))$)"));
     }

     public static boolean isNo(String str) {
        String s1=str.trim(); 
        return(s1.matches("(?i:^((no)|(n))$)"));
     }

     public static void main(String []args) {

        System.out.println(isYes(" yes "));
        System.out.println(isYes("  yEs  "));
        System.out.println(isYes("  y"));

        System.out.println(isNo(" yes "));
        System.out.println(isNo("  yEs  "));
        System.out.println(isNo("  y"));

        //--------------------------------

        System.out.println(isNo(" NO "));
        System.out.println(isNo("  no   "));
        System.out.println(isNo("n   "));

        System.out.println(isYes(" NO "));
        System.out.println(isYes("  no   "));
        System.out.println(isYes("n   "));

     }
}

输出:

true
true
true
false
false
false
true
true
true
false
false
false