我正在尝试将标记与函数中的 switch 语句进行匹配,其中一个标记需要能够识别 任何 字符串或 任何 定义的数字下面代码中的正则表达式。
基本上,是否可以针对 case "[a-z]+":
显然我现在的方式是,除非我将 STRING
或 NUMBER
作为参数传递,否则无法访问我的模式。
public Token analyzeToken(String token) {
Token tokenType = null;
switch (token) {
case "STRING":
Pattern p = Pattern.compile("[a-z]+");
Matcher m = p.matcher(token);
if(m.matches()) {
tokenType = Token.STRING;
break;
}
case "NUMBER":
Pattern p = Pattern.compile("[0-9]+");
Matcher m = p.matcher(token);
if(m.matches()) {
tokenType = Token.NUMBER;
break;
case "(":
tokenType = Token.LEFT_PAREN;
break;
case ")":
tokenType = Token.RIGHT_PAREN;
break;
case ".":
tokenType = Token.PERIOD;
break;
case ":":
tokenType = Token.COLON;
break;
case ";":
tokenType = Token.SEMICOLON;
default:
tokenType = TOKEN.UNKNOWN;
break;
}
}
最佳答案
不要在 switch
中这样做声明,在有条件的或更好的情况下,在循环中执行:
private interface TokenMatcher {
Token match(String s);
}
static List<TokenMatcher> matchers = new ArrayList<>();
static {
final Pattern strPattern = Pattern.compile("[a-z]+");
final Pattern numPattern = Pattern.compile("[0-9]+");
matchers.add( new TokenMatcher {
public Token match(String s) {
Matcher m = strPattern.matcher(s);
return m.matches() ? Token.STRING : null;
}
});
matchers.add( new TokenMatcher {
public Token match(String s) {
Matcher m = numPattern.matcher(s);
return m.matches() ? Token.NUMBER : null;
}
});
}
现在你可以这样做了:
static Token match(String s) {
for (TokenMatcher m : matchers) {
Token t = m.match(s);
if (t != null) {
return t;
}
}
return TOKEN.UNKNOWN;
}
for
循环已经取代了 switch
语句,而 matchers
中的条目名单已取代个人case
在 switch
中.添加新的 token 类型就像向 matchers
添加新模式及其相关实现一样简单。列表。
编辑:您可以通过用类替换上面的接口(interface)来缩短解决方案,如下所示:
private static final class TokenMatcher {
private final Pattern p;
private final Token t;
public TokenMatcher(String pString, Token t) {
p = Pattern.compile(pString);
this.t = t;
}
public Token match(String s) {
Matcher m = p.matcher(s);
return m.matches() ? t: null;
}
}
现在您的 matchers
初始化可以这样完成:
matchers.add(new TokenMatcher("[a-z]+", Token.STRING));
matchers.add(new TokenMatcher("[0-9]+", Token.NUMBER));
关于java - 如何匹配 switch 语句中的正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35249577/