检查几个正则表达式的字符串并说出哪个匹配
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>
等)
首先我知道已经有数以千计的 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>
等)