【问题标题】:Using Java Regex in order to find a subtring withing another substring使用 Java Regex 在另一个子字符串中查找子字符串
【发布时间】:2012-01-25 12:46:43
【问题描述】:

我有一个程序以逻辑表达式的形式接受用户输入(例如: (p=>(r||q)) )并将字符串划分为由括号定义的子字符串。我正在使用模式和匹配器。
因此,例如用户输入:
((p||q)=>r)
我想得到 2 个子字符串,它们是:
p||q
(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);
          }

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

【问题讨论】:

  • 正则表达式不太适合这个任务。我建议您手动进行解析或使用解析库。

标签: java regex substring


【解决方案1】:

你不能用正则表达式来做到这一点。

因为括号的使用表明你想要做的事情超出了正则表达式的能力。正则表达式描述了不能有括号结构的 Chomsky-3 语法。括号结构在 Chomsky-2 语法中可用。所以你必须用解析规则定义一个对应的语法。 ANTLR 是一个可以帮助您实现所需目标的好库。

【讨论】:

    【解决方案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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-17
      • 2017-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-10
      相关资源
      最近更新 更多