我有一个字符串,如下所示
TestFilter('value') AND LoadTestFilter('value1') AND UserFilter(value2) OR TestFilter('value3')
我想从上面的字符串中只提取TestFilter和括号。 我希望正则表达式只匹配这两个子串
TestFilter('value')
TestFilter('value3')
我试过下面的正则表达式
.*TestFilter\\((.*?)\\).*
它正在工作,但它也匹配字符串
中的LoadTestFilter如何仅匹配TestFilter。
答案 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')]