Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java正则表达式多模式顺序匹配_Java_Regex_Loops_Pattern Matching - Fatal编程技术网

java正则表达式多模式顺序匹配

java正则表达式多模式顺序匹配,java,regex,loops,pattern-matching,Java,Regex,Loops,Pattern Matching,我有一个具体的问题,我在网上找不到任何答案。基本上,我希望对文本运行模式匹配操作,使用多个模式。但是,我不希望matcher一次就得到结果,而是希望在循环的不同阶段调用每个模式,同时在每个阶段上执行特定的操作。例如,想象我有Pattern1,Pattern2,和Pattern3,我想要如下的东西: if (Pattern 1 = true) { delete Pattern1; } else if (Pattern 2 = true) { delete

我有一个具体的问题,我在网上找不到任何答案。基本上,我希望对文本运行模式匹配操作,使用多个模式。但是,我不希望matcher一次就得到结果,而是希望在循环的不同阶段调用每个模式,同时在每个阶段上执行特定的操作。例如,想象我有
Pattern1
Pattern2
,和
Pattern3
,我想要如下的东西:

 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等的帮助下一起编译和搜索..不幸的是,这不是我要寻找的)我可以将模式保存在数组中并在循环中调用每个模式吗

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

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

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

我不太确定我是否看到了这个问题。上面的要点实际上是伪代码。我还没有决定使用哪个循环,这就是为什么它现在看起来如此抽象的原因,但我会尝试一下。如果我需要编译模式(我确定我需要),我需要一个接一个地编译它们,还是可以使用容器来完成?顺便说一下,谢谢你!你想什么时候都行。在我前面的注释“Prepare”==“Get compiled Pattern object”。在我的一些项目中,我使用带有“静态”和上下文依赖模式的列表。因此,首先我编译了“静态”模式并将它们添加到列表中,然后根据需要添加动态形成的模式。我还应该提到边界匹配器\G(“上一次匹配的结束”)。当您对不同的模式依次使用
match()
时,它非常有用。