检查几个正则表达式的字符串并说出哪个匹配

Check a String for several regex and say which one matched

首先我知道已经有数以千计的 RegEx 帖子,遗憾的是我的 google/Whosebug 搜索技巧没有帮助找到我要找的东西。

我有一个服务器客户端通信。客户端等待用户的输入。 然后他将它发送到服务器,服务器检查它是否是一个有效的命令。

Pattern lowercase = Pattern.compile("LOWERCASE.*");
Pattern  uppercase = Pattern.compile("UPPERCASE.*");
Pattern  reverse = Pattern.compile("REVERSE.*");
Pattern  bye = Pattern.compile("BYE");
Pattern  shutdown = Pattern.compile("SHUTDOWN");

如果它以这些命令之一开始,请执行特定操作。 我在创建一个检查多个模式的 Matcher 时遇到问题,然后我想进入

Matcher.matches(uppercase|reverse|bye|...) //Is this how I do it?
switch(inputString){
case(lowercase):  do something
case(reverse):    do something else
}

等等。 我希望我的要求是可以理解的。 并且会有多个客户端与服务器对话,以防这与答案相关(例如线程和静态模式不能正常工作或其他)

谢谢。

我的方法是使用 Map 并将模式映射到 Runnable 这样的对象,然后调用对象来执行代码。或者,您可以映射到字符串,然后使用 switch 语句让这些字符串执行您的代码。

要检查模式,您只需遍历地图并使用其自己的匹配器测试每个模式。

你逐个模式进行,并使用 if 而不是 switch:

if (lowercase.matcher(inputStr).find()) {
    ... // Do something
} else if (reverse.matcher(inputStr).find()) {
    ... // Do something else
} else {
    ...
}

您可以将所有模式合并为一个,然后使用捕获组代替:

Pattern all = Pattern.compile(
    "(?<lower>LOWERCASE.*)|(?<upper>UPPERCASE.*)|(?<reverse>REVERSE.*)|..."
);
Matcher m = all.matcher(inputStr);
if (m.find()) {
    String upper = m.group("upper");
    String lower = m.group("lower");
    String reverse = m.group("reverse");
    if (upper != null) {
        ... // Do something
    }
    if (lower != null) {
        ... // Do something
    }
    if (reverse != null) {
        ... // Do something
    }
}

请注意,上面的代码使用命名捕获组(<upper><lower> 等)