在 Java 中将正则表达式用于开关语句

2022-09-01 20:20:55
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 的方法,但没有找到似乎与我的需求相关的方法。


答案 1

不能将正则表达式用作开关大小写。(想想看: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及更高版本。在此之前没有打开字符串。


答案 2

我不认为你可以在开关情况下使用正则表达式。

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

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