正则表达式捕获未配对的括号或括号

时间:2019-10-25 01:28:18

标签: java regex match parentheses brackets

正如标题所示,请准确地在Java中使用正则表达式捕获不成对的括号或括号。例如,假设我有下面的字符串;

Programming is productive, (achieving a lot, and getting good results), it is often 1) demanding and 2) costly.

如何捕获1)和2)。 我尝试过:

([^\(\)][\)])

但是,我得到的结果包括下面的s),而不是1)和2):

s), 1) and 2)

我已经检查了链接:Regular expression to match balanced parentheses,但是问题似乎是在涉及递归或嵌套结构,这与我的情况大不相同。 我的情况是匹配右括号或右括号,以及没有关联左括号或括号的任何关联文本。

2 个答案:

答案 0 :(得分:2)

也许

\b\d+\)
我猜

可能只是返回所需的输出。

Demo 1

另一种方法是查看您可能具有的左边界,在这种情况下,我将看到数字,然后是右花括号之前的其他字符,然后我们可以设计一些类似于:

\b\d[^)]*\) 

Demo 2

测试

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegularExpression{

    public static void main(String[] args){

        final String regex = "\\b\\d[^)]*\\)";
        final String string = "Programming is productive, (achieving a lot, and getting good results), it is often 1) demanding and 2) costly.\n\n"
             + "Programming is productive, (achieving a lot, and getting good results), it is often 1a b) demanding and 2a a) costly.\n\n\n"
             + "Programming is productive, (achieving a lot, and getting good results), it is often 1b) demanding and 2b) costly.\n\n"
             + "It is not supposed to match ( s s 1) \n";

        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
        final Matcher matcher = pattern.matcher(string);

        while (matcher.find()) {
            System.out.println("Full match: " + matcher.group(0));
            for (int i = 1; i <= matcher.groupCount(); i++) {
                System.out.println("Group " + i + ": " + matcher.group(i));
            }
        }


    }
}

输出

Full match: 1)
Full match: 2)
Full match: 1a b)
Full match: 2a a)
Full match: 1b)
Full match: 2b)
Full match: 1)

RegEx电路

jex.im可视化正则表达式:

enter image description here

答案 1 :(得分:2)

(显然)这不是一个正则表达式解决方案,但是我想不出一个好方法。这只是使用堆栈来跟踪对象。

对于输入字符串"(*(**)**) first) second) (**) (*ksks*) third) ** fourth)( **)

它打印出来

  

第一)
    第二)
    第三)
    第四)

所有其他括号都将被忽略,因为它们是匹配的。

      String s =
            "(*(**)**) first) second) (**) (*ksks*) third) ** fourth)( **)";
      Pattern p;
      List<String> found = new ArrayList<>();
      Stack<Character> tokens = new Stack<>();
      int pcount = 0;

      for (char c : s.toCharArray()) {
         switch (c) {
            case ' ':
               tokens.clear();
               break;
            case '(':
               pcount++;
               break;
            case ')':
               pcount--;
               if (pcount == -1) {
                  String v = ")";
                  while (!tokens.isEmpty()) {
                     v = tokens.pop() + v;
                  }
                  found.add(v);
                  pcount = 0;
               }
               break;
            default:
               tokens.push(c);
         }
      }
      found.forEach(System.out::println);

注意:将方括号(])整合到上述内容中将是一个挑战(尽管并非不可能),因为人们需要检查( [ ) ]之类的构造,但不清楚如何解释。这就是为什么在指定此类需求时,需要准确说明它们的原因。