正则表达式匹配精确的子串java

时间:2017-08-20 05:26:06

标签: java regex

我有一个字符串,如下所示

TestFilter('value') AND LoadTestFilter('value1') AND UserFilter(value2) OR TestFilter('value3')

我想从上面的字符串中只提取TestFilter和括号。 我希望正则表达式只匹配这两个子串

 TestFilter('value')
 TestFilter('value3')

我试过下面的正则表达式

.*TestFilter\\((.*?)\\).*

它正在工作,但它也匹配字符串

中的LoadTestFilter

如何仅匹配TestFilter。

3 个答案:

答案 0 :(得分:1)

    String s = "TestFilter('value') AND LoadTestFilter('value1') AND UserFilter(value2) OR TestFilter('value3')";
    Matcher m = Pattern.compile("\\bTestFilter\\(.*?\\)").matcher(s);
    while (m.find()) {
        System.out.println(m.group(0));
    }

说明:

这里的关键是\b,它匹配字边界。我使用的正则表达式中的\b在匹配的最开始和TestFilter之前匹配单词边界。翻译成一种不那么像正则表达式的语言,我们在TestFilter之前不想要任何字母。

根据您的评论,您看到已尝试.*\bTestFlter\(.*?\)。由于前面的.*,这不起作用。你基本上匹配了一堆随机字符,然后是一个单词边界," TestFilter"然后是一对带有随机内容的括号。这将匹配整个字符串,因为TestFilter的最后一个实例前面是一个单词边界,然后是一堆随机字符。

答案 1 :(得分:0)

试试这个:

"\r\n"

没有第一个(。*)

答案 2 :(得分:0)

\b匹配正则表达式中的单词边界。 因此,\bTestFilter将匹配"TestFilter",但不匹配"LoadTestFilter",因为"Load""Test"之间没有字边界。

因此,您可以使用:

\\bTestFilter\\((.*?)\\)

.*\\bTestFilter\\((.*?)\\).*

取决于您对输入的匹配方式(例如match() -vs- find()

Matcher#find示例:

String haystack = "TestFilter('value') AND LoadTestFilter('value1') AND UserFilter(value2) OR TestFilter('value3')";
Matcher needle = Pattern.compile("\\bTestFilter\\((.*?)\\)").matcher(haystack);

while(needle.find()) {
    System.out.format("[%s] found in [%s]%n", needle.group(1), needle.group());
}

输出:

['value'] found in [TestFilter('value')]
['value3'] found in [TestFilter('value3')]