java - 重构模式匹配序列

标签 java regex refactoring

我有以下代码(示例中已缩短):

while (reader.ready()) {
    String line = reader.readLine();

    Matcher responseCodeMatcher = responseCodePattern.matcher(line); 
    if (responseCodeMatcher.matches()) {
        responseCode = Integer.parseInt(responseCodeMatcher.group(1));
        continue;
    }

    Matcher cacheControlMatcher = cacheControlPattern.matcher(line); 
    if (cacheControlMatcher.matches()) {
        cacheControl = CacheControl.parseString(responseCodeMatcher.group(1));
        continue;
    }

        ...

}

这些模式都是类的静态最终成员。 所以我有一堆模式,我想找出每一行是否与其中一个匹配,如果是的话 - 做一些事情(根据模式的不同而变化)。你能想出一种方法来很好地重构它吗?也许是我浏览过的模式集合(然后我如何知道如果它匹配该怎么办?)或其他一些想法。

最佳答案

因为到目前为止还没人回答,所以我会回答,尽管我不懂 Java。
在 C# 中,我将创建一个元组列表。元组的第 1 项是要检查的模式,第 2 项是匿名方法,其中包含要执行的模式特定代码。在 C# 中,它看起来像这样:

var patterns = new List<Tuple<Pattern, Action<Matcher>>>();
patterns.Add(Tuple.Create(responseCodePattern, matcher =>
    {
        responseCode = Integer.parseInt(matcher.group(1));
    }));

patterns.Add(Tuple.Create(cacheControlPattern, matcher =>
    {
        cacheControl = CacheControl.parseString(matcher.group(1));
    }));

while (reader.ready()) {
    String line = reader.readLine();
    foreach(var tuple in patterns)
    {
        Matcher matcher = tuple.Item1.matcher(line);
        if(matcher.matches())
        {
            tuple.Item2(matcher);
            break;
        }
    }
}

我不知道这对 Java 人员是否有意义,尤其是使用 lambda 语法...如果没有,请询​​问:-)

关于java - 重构模式匹配序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5677573/

相关文章:

javascript - 在 JavaScript 中用 map 方法替换 for 循环

ios - 将 UITableViewController 子类重构为 UIViewController 子类

java - 有没有办法将 java 应用程序添加到我的 github 网站,以便我的个人网站有该应用程序的现场演示?

java - 不知道如何修复我的代码

Java 泛型和多态性 - 如何在运行时缩小泛型类型范围

C# - 只有字母和数字的文本框

正则表达式删除数字和单词字符串中的最后两个字母

java - 无法使用 Xpath 和 CSS 找到元素

c# - 如何修复我的正则表达式 ^\d+[-\d]?\d* 以匹配 123-45 而不是 123-?

javascript - 如何在 apostropecms 中重构客户端 js