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

标签 java regex switch-statement

我正在尝试将标记与函数中的 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/

相关文章:

reporting-services - 在SSRS 2008中的开关表达式中使用AND

java - 具有 stomp 安全性的 Spring websocket - 每个用户都可以订阅任何其他用户队列?

javascript - javascript 上的预期十六进制

javascript - 在文件结束前添加和删除文本的正则表达式

python - 如何在 python 中通过\r\n 进行正则表达式

Java - 案例循环

swift - 复合开关盒 : may we have a single common value binding for compound enum cases that have the same type of associated value?

java - Apache Derby 嵌入式模式部署

java - GAE/J : How do I POST a Multipart MIME message from appengine to facebook

java - If 语句在 Android OnClick 中不起作用