gpt4 book ai didi

java - 如何匹配 switch 语句中的正则表达式?

转载 作者:搜寻专家 更新时间:2023-10-31 19:32:25 24 4
gpt4 key购买 nike

我正在尝试将标记与函数中的 switch 语句进行匹配,其中一个标记需要能够识别 任何 字符串或 任何 定义的数字下面代码中的正则表达式。

基本上,是否可以针对 case "[a-z]+":

这样的情况定义正则表达式

显然我现在的方式是,除非我将 STRINGNUMBER 作为参数传递,否则无法访问我的模式。

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 中的条目名单已取代个人caseswitch 中.添加新的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com