在Java中使用regex for switch-statement

jol*_*ger 18 java regex switch-statement

void menu() {
    print();
    Scanner input = new Scanner( System.in );
    while(true) {
        String s = input.next();
        switch (s) {
        case "m": print(); continue;
        case "s": stat(); break;
        case "[A-Z]{1}[a-z]{2}\\d{1,}": filminfo( s ); break;
        case "Jur1": filminfo(s); break; //For debugging - this worked fine
        case "q": ; return;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

似乎我的正则表达式已关闭或我在案例陈述中没有正确使用它.我想要的是一个字符串:开头只有一个大写字母,后面跟着两个小写字母,后跟至少一个数字.

我已经检查了正则表达式API并尝试了三种变体(贪婪,不情愿和占有量词),却不知道它们的正确用法.还检查了String的方法,但没有找到与我的需求相关的方法.

cHa*_*Hao 33

您不能将正则表达式用作切换案例.(想想看:Java如何知道你是否想匹配字符串"[A-Z]{1}[a-z]{2}\\d{1,}"或正则表达式?)

在这种情况下,您可以做的是尝试匹配默认情况下的正则表达式.

    switch (s) {
        case "m": print(); continue;
        case "s": stat(); break;
        case "q": return;
        default:
            if (s.matches("[A-Z]{1}[a-z]{2}\\d{1,}")) {
                filminfo( s );
            }
            break;
    }
Run Code Online (Sandbox Code Playgroud)

(顺便说一句,这只适用于Java 7及更高版本.在此之前没有切换字符串.)

  • 处理此案的好方法:) (2认同)

n0r*_*m1e 6

我不认为你可以在交换机案例中使用正则表达式.

将switch表达式中的String与每个case标签关联的表达式进行比较,就好像正在使用String.equals方法一样.

有关详细信息,请参阅http://download.oracle.com/javase/7/docs/technotes/guides/language/strings-switch.html.