【问题标题】:Java Regex : Find out nested patterns and repeated occurrences [duplicate]Java Regex:找出嵌套模式和重复出现[重复]
【发布时间】:2020-11-19 19:52:10
【问题描述】:

我正在尝试解析具有以下模式的字符串:

  • a2[u]
  • 3[rst]5[g]
  • 3[r2[g]]

我想将这些字符串提取到以下标记中:

  • 2 [u]
  • 3 [rst], 5 [g]
  • 2 [r, 3 [r2[g]](嵌套组)

我正在使用以下PatternCode

Pattern MY_PATTERN = Pattern.compile("(\\d+)\\[(.+)\\]");
String input = "3[rst]5[g]";
Matcher m = MY_PATTERN.matcher(input);
while(m.find()) {
    System.out.println(m.group(1) + " " + m.group(2));
}

但是,它匹配最后一次出现的 ] 而不是第一次出现,这会导致意外结果。如果我将模式更改为(\\d+)\\[(\\w+)\\],它可以工作但3[r2[g]] 失败。我需要进行哪些更改才能不将整个字符串视为一个匹配项?

【问题讨论】:

  • 如果您计划匹配多于 1 的嵌套级别,则正则表达式将变得笨拙。否则,请使用"(\\d+)\\[([^\\]\\[]*(?:\\[[^\\]\\[]*][^\\]\\[]*)*)]"
  • 它是否有效或者您需要更多的嵌套级别支持?
  • @Darshan:我建议不要为此使用正则表达式。最好使用令牌解析器,因为您正在处理嵌套括号。
  • @WiktorStribiżew 恐怕它需要更多的嵌套级别。所以,我会按照 anubhava 的建议使用令牌解析器。

标签: java regex nested


【解决方案1】:

看来您需要在 .+ 中添加 quantifier

目前的 .会吃掉整个字符串,然后只匹配最后一个]。添加一个不情愿的量词 ?到 .+ 所以制作正则表达式 (\\d+)\\[(.+?)\\] 看看你能走多远......

【讨论】:

  • 不可能,惰性点会匹配3[r2[g]]中的3[r2[g]
  • 好的 - 所以正则表达式不是答案
猜你喜欢
  • 2011-03-22
  • 2015-11-07
  • 2012-09-22
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
  • 2021-09-30
相关资源
最近更新 更多