【问题标题】:java regex multiple patterns sequential matchingjava正则表达式多模式顺序匹配
【发布时间】:2012-08-29 16:15:55
【问题描述】:

我有一个具体的问题,我在网上找不到任何答案。基本上,我想对具有多种模式的文本运行模式匹配操作。但是,我不希望匹配器一次得到所有结果,而是在循环的不同阶段调用每个模式,同时在每个阶段执行特定操作。例如,假设我有Pattern1Pattern2Pattern3,我想要类似的东西:

 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 等的帮助下一起搜索......不幸的是,这不是我想要的)我可以将模式保存在一个数组中并在我的环形?

【问题讨论】:

  • 不太确定我看到了这个问题。您上面的要点实际上是伪代码。只需添加一些 if 块...
  • 我还没有决定我将使用哪个循环,这就是为什么它现在看起来如此抽象,但我会尝试一下。

标签: java regex loops pattern-matching


【解决方案1】:

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

【讨论】:

  • 如果我需要编译模式(我确定我会这样做),我需要一个一个地编译它们,还是可以使用容器来完成?顺便说一句,谢谢!
  • 随心所欲。在我之前的评论中“准备”==“获取已编译的模式对象”。在我的一些项目中,我使用了带有“静态”和上下文相关模式的列表。所以首先我编译了“静态”模式并将它们添加到列表中,然后按需添加动态形成的模式。
  • 我还应该提到边界匹配器 \G(“上一场比赛的结束”)。当您以不同的模式顺序使用 match() 时,它很有用。
【解决方案2】:

您可以创建一个通用接口,并使用模式或任何其他您可能想要转换字符串的匿名实现:

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 的实现根本不需要使用正则表达式。底部的循环不知道正则表达式参与获取结果。

【讨论】:

    猜你喜欢
    • 2012-06-17
    • 1970-01-01
    • 2016-04-24
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多