【发布时间】: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]](嵌套组)
我正在使用以下Pattern 和Code:
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 的建议使用令牌解析器。