使用Java Regex在另一个子字符串中查找子字符串

时间:2011-12-21 18:10:14

标签: java regex substring

我有一个程序以逻辑表达式的形式接受用户输入(例如:(p =>(r || q)))并将字符串分成由括号定义的子串。我正在使用模式和匹配器 因此,例如用户输入:
((对|| Q)=> R)。
我想获得2个子串: 点||常见
和 的(P || Q)=>:R
但是我只能得到这个:
(p || q

以下是我正在使用的代码

 Scanner scanner = new Scanner(System.in);
 System.out.println("Enter formula: ");
 String formula = scanner.next();
 Pattern pattern = Pattern.compile("\\((.*?)\\)");
 Matcher matcher = pattern.matcher(formula);
         while(matcher.find())
         {
          String s = matcher.group(1);

          System.out.println(s);
          }

所以我需要一种方法,程序找到该字符串中的所有子字符串。

2 个答案:

答案 0 :(得分:2)

您无法使用正则表达式执行此操作。

因为使用括号表示您想要做的事情超出了正则表达式的功能。正则表达式描述了Chomsky-3语法,它不具有括号结构。支架结构以Chomsky-2语法提供。因此,您必须使用解析规则定义相应的语法。一个可以帮助您实现目标的好图书馆是ANTLR

答案 1 :(得分:2)

正如我在评论中所说,正则表达式根本不能处理嵌套括号。但是,如果您有一个堆栈,手动解析它们非常简单。以下是一些示例代码:

public static void main(String[] args) throws InterruptedException {
    findSubExpressions("((p||q)=>r)");
}

private static void findSubExpressions(String input) {
    Deque<Integer> startingBrackets = new LinkedList<Integer>();

    for (int i = 0; i < input.length(); i++) {
        char c = input.charAt(i);
        if (c == '(') {
            startingBrackets.push(i);
        } else if (c == ')') {
            int correspondingStart = startingBrackets.pop();
            logSubExpression(input.substring(correspondingStart+1, i));
        }
    }
}

private static void logSubExpression(String subExpression) {
    System.out.println(subExpression);
}