Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查字符串中的几个正则表达式,并说出哪一个匹配_Java_Regex_Server_Client_Matcher - Fatal编程技术网

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

Java 检查字符串中的几个正则表达式,并说出哪一个匹配,java,regex,server,client,matcher,Java,Regex,Server,Client,Matcher,首先,我知道已经有成千上万的RegEx帖子了,可悲的是,我的google/stackoverflow搜索技能并没有帮助我找到我想要的东西 我有一个服务器-客户端通信。客户端等待用户的输入。 然后他将其发送到服务器,服务器检查该命令是否有效 Pattern lowercase = Pattern.compile("LOWERCASE.*"); Pattern uppercase = Pattern.compile("UPPERCASE.*"); Pattern reverse = Patter

首先,我知道已经有成千上万的RegEx帖子了,可悲的是,我的google/stackoverflow搜索技能并没有帮助我找到我想要的东西

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

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.matches(uppercase|reverse|bye|...) //Is this how I do it?
switch(inputString){
case(lowercase):  do something
case(reverse):    do something else
}
等等。 我希望我的要求是可以理解的。 而且会有多个客户机与服务器对话,以防这与答案有关(比如线程和静态模式不能很好地工作等等)


谢谢。

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


要检查模式,您只需在地图上迭代并使用自己的匹配器测试每个模式。

您可以逐个模式进行测试,并使用
if
而不是
开关

if (lowercase.matcher(inputStr).find()) {
    ... // Do something
} else if (reverse.matcher(inputStr).find()) {
    ... // Do something else
} else {
    ...
}
您可以将所有模式组合为一个,并改用捕获组:

Pattern all=Pattern.compile(
“(?小写。*)|(?大写。*)|(?反向。*)|…”
);
匹配器m=所有的匹配器(inputStr);
if(m.find()){
字符串上限=m组(“上限”);
下线=m组(“下线”);
字符串反向=m.group(“反向”);
如果(上限!=null){
…做点什么
}
如果(较低!=null){
…做点什么
}
如果(反向!=null){
…做点什么
}
}

请注意,上面的代码使用命名的捕获组(
,等等)。

啊,是的,我觉得这就是我想要的-使用第二种方法更快?我想我最好不要使用Pattern.matcher.(expression).find(),因为它会被反复编译。。而第二种方法只编译一次。我对这一点的理解正确吗?我还是一个编程新手。@InDaPond它还不错,因为每个模式只编译一次——也就是说,当您调用
compile()
时。但是,将创建多个
Matcher
实例,这可能是次优的。尽管如此,您还是应该选择一种对您(以及对那些将审查/维护您的代码的人)更具可读性的方法。速度是远远不够的,因为在您的系统中花费的大部分时间都是将数据传递到服务器并返回。我试图通过聊天与您联系,但不知道如何联系。我有一个后续问题,也许你也想去那里看我:谢谢!我对此仍然没有有效的答复。我可以看看吗@达斯宾莱特
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
    }
}