【问题标题】:How to ignore repeating regex pattern [duplicate]如何忽略重复的正则表达式模式[重复]
【发布时间】:2020-12-14 16:46:09
【问题描述】:

我不知道如何表达这个问题的标题,但想象一下我有以下字符串:

(1,2),(3,(4))

我想要一个允许我获取1,23,(4) 的正则表达式

我目前拥有的正则表达式是\\(([^)]*)\\)

这个正则表达式的问题是它让我知道1,23,(4。发生这种情况是因为它与 (4) 的括号匹配。但是我需要一个忽略 4 的括号并且只匹配外部括号的正则表达式,如果这有意义的话。

编辑:为了更深入地了解问题,这是我期望的确切类型的字符串:(STRING1,STRING2),(STRING3,STRING4) 其中STRING 是一串随机字符(它可以有字母、数字、空格、其他随机符号) .由于它有随机字符,字符串本身可以有括号,这将触发正则表达式。我基本上需要跟踪发现的每个括号,我可以忽略与其他左括号匹配的右括号。

【问题讨论】:

  • 你说你需要得到1,23,(4)但你也想忽略4的括号?
  • Regex 不擅长匹配任意嵌套的语法。使用您自己的代码或解析器库来解析它会更容易。
  • 这个例子太具体了。请举出更多例子。此外,您想忽略字符串中的其他字符吗? (1,2), (3,4)) xyz。空格等呢?
  • 我为我的问题添加了更多细节。希望现在更清楚了。我认为@Hulk 已经掌握了要点,但我不确定如何实现这一点。
  • @Hulk 但我对里面的东西很感兴趣。我想要的正是我在示例中展示的内容

标签: java regex


【解决方案1】:

Regex 可能不适合这项工作。取而代之的是,迭代方法可以一次性匹配此类事物,而无需借助递归等。

注意:与此同时,此问题已(正确地)作为副本关闭。 下面是一个有点幼稚且肯定不完美的算法的 java 实现,与链接副本的 this answer 中提出的算法非常相似。

如果您只对最外面的一对匹配括号感兴趣,可以这样做:

public static void main(String[] args) {                    

    String s = "(1,2),(3,(4))";
    
    ArrayList<String> matches = new ArrayList<>();
    
    int depth = 0;
    int startIndex = 0;
    int i = 0;
    
    for (char c : s.toCharArray()) {
        if (c == '(') {
            if (depth == 0) {
                startIndex = i;
            }
            depth++;
        }
        if (c == ')') {
            depth--;
            if (depth == 0) {
                matches.add(s.substring(startIndex+1, i));
            }
        }
        i++;
    }
    System.out.println(matches.size());
    System.out.println(matches);
}

请注意,此代码不处理输入包含更多关闭而不是打开括号的情况 - depth 只是得到否定。您可能希望为这些情况添加语法错误处理(我相信还有其他情况)。

【讨论】:

  • 这正是我想要的。谢谢!
猜你喜欢
  • 2012-10-22
  • 2019-02-08
  • 2013-08-13
  • 2015-10-02
  • 1970-01-01
  • 2020-01-16
  • 2018-01-21
  • 1970-01-01
  • 2014-11-12
相关资源
最近更新 更多