2

考虑以下代码:

if (matcher1.find()) {
   String str = line.substring(matcher1.start()+7,matcher1.end()-1);
   /*+7 and -1 indicate the prefix and suffix of the matcher... */    
   method1(str);
}
if (matcher2.find()) {
   String str = line.substring(matcher2.start()+8,matcher2.end()-1);
   method2(str);
}
...

我有 n 个匹配器,所有匹配器都是独立的(如果一个是真的,它不会说明其他匹配器......),对于每个为真的匹配器 - 我正在对其匹配的内容调用不同的方法。
问题:我不喜欢这里的代码重复和“幻数”,但我想知道是否有更好的方法......?(也许是访客模式?)有什么建议吗?

4

4 回答 4

4

创建一个抽象类,并在子类中添加偏移量(也进行字符串处理......取决于您的要求)。

然后将它们填充到列表中并处理该列表。

这是一个示例抽象处理器:

public abstract class AbsractProcessor {

    public void find(Pattern pattern, String line) {
        Matcher matcher = p.matcher(line);
        if (matcher.find()) {
            process(line.substring(matcher.start() + getStartOffset(), matcher.end() - getEndOffset()));
        }
    }

    protected abstract int getStartOffset();

    protected abstract int getEndOffset();

    protected abstract void process(String str);

}
于 2011-04-07T08:22:28.847 回答
1

使用捕获组简单地标记要传递给方法的正则表达式部分。

例如,如果您的正则表达式是并且您对orfoo.*bar不感兴趣,请制作正则表达式。然后总是从.foobarfoo(.*)barMatcher

您的代码将如下所示:

method1(matcher1.group(1));
method2(matcher2.group(2));
...

进一步的步骤是用实现这样的类替换您的方法:

public interface MatchingMethod {
  String getRegex();
  void apply(String result);
}

然后您可以轻松地自动执行任务:

for (MatchingMethod mm : getAllMatchingMethods()) {
  Pattern p = Pattern.compile(mm.getRegex());
  Matcher m = p.matcher(input);
  while (m.find()) {
    mm.apply(m.group(1));
}

Pattern请注意,如果性能很重要,那么如果将其应用于许多输入,则预编译可以提高运行时间。

于 2011-04-07T08:28:23.720 回答
0

你可以让它更短一点,但我的问题是,这真的值得付出努力吗:

private String getStringFromMatcher(Matcher matcher, int magicNumber) {
   return line.subString(matcher.start() + magicNumber, matcher.end() - 1 )
}

if (matcher1.find()) {
method1(getStringFromMatcher(matcher1, 7);
}

if (matcher2.find()) {
method2.(getStringFromMatcher(mather2, 8);
}
于 2011-04-07T08:24:52.220 回答
0

将 Cochard 的解决方案与带有所有 methodX 方法的工厂(switch 语句)结合使用。所以你可以这样称呼它:

Factory.CallMethodX(myEnum.MethodX, str)

您可以在 Cochard 解决方案的填充步骤中分配 myEnum.MethodX

于 2011-04-07T08:28:06.363 回答