在 Java 中使用正则表达式进行 switch 语句

问题描述 投票:0回答:3
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;
        }
    }
}

看来我的正则表达式已关闭,或者我没有在 case 语句中正确使用它。我想要的是一个字符串: 以一个大写字母开头,后跟两个小写字母,后跟至少一个数字。

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

java regex switch-statement
3个回答
45
投票

您不能使用正则表达式作为 switch case。 (想一想: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;
    }

(顺便说一句,这仅适用于 Java 7 及更高版本。在此之前无法切换字符串。)


6
投票

我认为你不能在 switch case 中使用正则表达式。

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

请参阅 http://download.oracle.com/javase/7/docs/technotes/guides/language/strings-switch.html 了解更多信息。


0
投票

终于在10多年之后,在java 21中;您应该能够通过开关的模式匹配来做到这一点:

https://openjdk.org/jeps/441

示例代码应减少为

void menu() {
    print();
    Scanner input = new Scanner( System.in );
    while(true) {
        String s = input.next();
        switch (s) {
           case "m" -> {
              print();
              stat();
           }
           case "s" -> stat();
           case "Jur1" -> filminfo(s); //For debugging - this worked fine
           case "q" -> {}
           case String s when Patten.match("[A-Z]{1}[a-z]{2}\\d{1,}", s) -> filminfo(s);
           default -> {}
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.