正则表达式按顺序匹配字符串

时间:2017-08-03 08:53:00

标签: java regex

我的字符串如下

"ValueFilter("val1") AND ColumnFilter("val2") AND ValueFilter("val3")"

我已将以下正则表达式存储在数组中。使用for循环我试图匹配模式

"ValueFilter\\((.*?)\\)","ColumnFilter\\((.*?)\\)"

我将做的是将替换括号中的值并将其复制到新字符串。

当我在第一个循环中对字符串运行上面的正则表达式时,我有XFilter所以它将匹配两个匹配项。但我想按顺序这样做。

这是我想要实现的目标

首先我想首先匹配ValueFilter然后再匹配ColumnFilter然后再匹配ValueFilter。我怎样才能做到这一点?

修改:添加了代码

String expr = "\"ValueFilter(\"val1\") AND ColumnFilter(\"val2\") AND ValueFilter(\"val3\")\"";

String patterns = {"ValueFilter\\((.*?)\\)", "ColumnFilter\\((.*?)\\)"}

for (String pattern : patterns) {
    Pattern r = Pattern.compile(pattern);
    Matcher m = r.matcher(expr);

    while (m.find()) {

        //do something
    }
}

预期输出

ValueFilter("val1")
ColumnFilter("val2")
ValueFilter("val3")

1 个答案:

答案 0 :(得分:2)

您可以将此正则表达式<anything>: STUPID; <anything>: <anything>...与模式一起使用,并且必须使用以下方法循环匹配:

[XY]Filter\((.*?)\)

注意您可以使用String str = "\"XFilter(\"val1\") AND YFilter(\"val2\") AND XFilter(\"val3\")\""; String regex = "[XY]Filter\\((.*?)\\)"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(str); while (matcher.find()) { System.out.println(matcher.group()); } 来表示匹配[XY]X

<强>输出

Y

regex demo

如果你只想获得值,你可以得到像XFilter("val1") YFilter("val2") XFilter("val3") 这样的组1,输出应该是:

matcher.group(1)

修改

  

如果我有filtername作为&#34; "val1" "val2" "val3" &#34;和&#34; ValueFilter&#34;代替   ColumnFilterX

在这种情况下,您可以使用Y代替(Value|Column),这意味着匹配[XY]ValueFilter,正则表达式应如下所示:

ColumnFilter

<强>输出

String str = "\"ValueFilter(\"val1\") AND ColumnFilter(\"val2\") AND ValueFilter(\"val3\")\"";
String regex = "(Value|Column)Filter\\((.*?)\\)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);

while (matcher.find()) {
    System.out.println(matcher.group());
}

Check code demo