Java Regex帮助提取负前瞻

时间:2013-12-11 13:51:11

标签: java regex

我有一个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)\\(.*?\\)而是没有回复我的期望。任何身体都可以帮我解决问题吗?

2 个答案:

答案 0 :(得分:0)

目前尚不清楚嵌套括号中你想要什么(例如。((a = 2 and b = 3)):这是否有效?)

这个正则表达式可以帮助你完成大部分工作:

(\(.*?\)+)

在您指定的输入上,它匹配两个组:

  • ((a=2 and age IN (15,18,56))
  • (b=3 and c=4))(注意最后的双括号)。

它将返回所有内容,包括嵌套括号。另一种变体只返回单括号表达式:

(\([^(]*?\))

最简单的测试方法是Rubular

答案 1 :(得分:0)

您需要解析嵌套表达式,而单独的正则表达式不能为您执行此操作。正则表达式只会捕获\\(([^(]*?)\\)

的最内层表达式

您可以使用PatternMatcher类来编写更复杂的解决方案。

或者您可以使用解析器。对于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))"));
    }
}