我有一个reg ex \\(.*?\\)
来匹配我的文本中括号内的内容
例如((a=2 and age IN (15,18,56)) and (b=3 and c=4))
我的输出应该只包含:
a=2 and age IN (15,18,56)
b=3 and c=4
我尝试使用否定前瞻,不是为了匹配.*(?!IN)\\(.*?\\)
而是没有回复我的期望。任何身体都可以帮我解决问题吗?
答案 0 :(得分:0)
目前尚不清楚嵌套括号中你想要什么(例如。((a = 2 and b = 3))
:这是否有效?)
这个正则表达式可以帮助你完成大部分工作:
(\(.*?\)+)
在您指定的输入上,它匹配两个组:
((a=2 and age IN (15,18,56))
(b=3 and c=4))
(注意最后的双括号)。它将返回所有内容,包括嵌套括号。另一种变体只返回单括号表达式:
(\([^(]*?\))
最简单的测试方法是Rubular。
答案 1 :(得分:0)
您需要解析嵌套表达式,而单独的正则表达式不能为您执行此操作。正则表达式只会捕获\\(([^(]*?)\\)
您可以使用Pattern
和Matcher
类来编写更复杂的解决方案。
或者您可以使用解析器。对于Java,有ANTL。
我刚刚编写了一些可能对你有所帮助的内容:
public class NestedParser {
private final char opening;
private final char closing;
private String str;
private List<String> matches;
private int matchFrom(int beginIndex, boolean matchClosing) {
int i = beginIndex;
while (i < str.length()) {
if (str.charAt(i) == opening) {
i = matchFrom(i + 1, true);
if (i < 0) {
return i;
}
} else if (matchClosing && str.charAt(i) == closing) {
matches.add(str.substring(beginIndex, i));
return i + 1;
} else {
i++;
}
}
return -1;
}
public NestedParser(char opening, char closing) {
this.opening = opening;
this.closing = closing;
}
public List<String> match(String str) {
matches = new ArrayList<>();
if (str != null) {
this.str = str;
matchFrom(0, false);
}
return matches;
}
public static void main(String[] args) {
NestedParser parser = new NestedParser('(', ')');
System.out.println(parser.match(
"((a=2 and age IN (15,18,56)) and (b=3 and c=4))"));
}
}