2012-08-29 47 views
2

我有一个具体问题,我无法在网上找到任何答案。基本上,我想对文本运行模式匹配操作,并使用多种模式。但是,我不希望匹配器一次性得到结果,而是在循环的不同阶段调用每个模式,同时在每个阶段执行特定的操作。因此,举例来说,想象我有Pattern1Pattern2Pattern3,我想是这样的:java正则表达式多种模式顺序匹配

if (Pattern 1 = true) { 
     delete Pattern1; 
    } else if (Pattern 2 = true) { 
     delete Pattern2; 
    } else if (Pattern 3 = true) { 
     replace with 'something; 
    } .....and so on 

(这仅仅是一个循环的说明,所以大概的语法不正确,)

我的问题是:我如何编译不同的模式,同时分别调用它们? (我只看到多个模式编译在一起,并在AND/OR等帮助下一起搜索......这不是我正在寻找的不幸)我可以将模式保存在一个数组中,然后调用它们中的每一个我的循环?

+1

不太确定我看到这个问题。上面的要点几乎都是伪代码。只是扔在一些如果块... – jtahlborn

+0

我还没有决定我将使用哪个循环,这就是为什么它看起来这么抽象,但我会试一试。 – SophieM

回答

2

准备您的Pattern对象pattern1, pattern2, pattern3并将它们存储在任何容器(数组或列表)中。然后在每次迭代中使用usePattern(Pattern newPattern)方法Matcher对象遍历此容器。

+0

,如果我需要编译模式(我敢肯定我),是否需要逐个编译它们,或者可以使用容器来完成这些工作?顺便谢谢! – SophieM

+0

每当你想要。在我之前的评论'准备'=='获取编译的模式对象'。在我的一些项目中,我使用了“静态”和依赖于上下文的模式。所以首先我编译“静态”模式并将它们添加到列表中,然后根据需要添加动态形成的模式。 –

+0

有帮助,谢谢! – SophieM

1

你可以做一个通用的接口,并使用图形或任何其他你可能想改变你的字符串匿名实现:

interface StringProcessor { 
    String process(String source); 
} 

StringProcessor[] processors = new StringProcessor[] { 
    new StringProcessor() { 
     private final Pattern p = Pattern.compile("[0-9]+"); 
     public String process(String source) { 
      String res = source; 
      if (p.matcher(source).find()) { 
       res = ... // delete 
      } 
      return res; 
     } 
    } 
, new StringProcessor() { 
     private final Pattern p = Pattern.compile("[a-z]+"); 
     public String process(String source) { 
      String res = source; 
      if (p.matcher(source).find()) { 
       res = ... // replace 
      } 
      return res; 
     } 
    } 
, new StringProcessor() { 
     private final Pattern p = Pattern.compile("[%^#@]{2,5}"); 
     public String process(String source) { 
      String res = source; 
      if (p.matcher(source).find()) { 
       res = ... // do whatever else 
      } 
      return res; 
     } 
    } 
}; 

String res = "My starting string 123 and more 456"; 
for (StringProcessor p : processors) { 
    res = p.process(res); 
} 

注意的StringProcessor.process实现并不需要在所有使用正则表达式。底部的循环不知道正则表达式涉及获取结果。