Java正则表达式:找出嵌套模式和重复出现
我正在尝试分析具有以下模式的字符串:Java正则表达式:找出嵌套模式和重复出现,java,regex,nested,Java,Regex,Nested,我正在尝试分析具有以下模式的字符串: a2[u] 3[rst]5[g] 3[r2[g]] 我想将这些字符串提取到以下标记中: 2[u] 3[rst],5[g] 2[r,3[r2[g](嵌套组) 我正在使用以下模式和code: Pattern MY_PATTERN = Pattern.compile("(\\d+)\\[(.+)\\]"); String input = "3[rst]5[g]"; Matcher m = MY_PATTERN.mat
a2[u]
3[rst]5[g]
3[r2[g]]
2[u]
3[rst],5[g]
(嵌套组)2[r,3[r2[g]
模式
和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]]
时失败。我需要做哪些更改,以便不将整个字符串计算为一个匹配项?看起来您需要在匹配项中添加一个+
就目前情况而言。将吃掉整根绳子,然后只匹配最后一根]。添加一个不情愿的量词?将正则表达式设置为“.+”
(\\d+\\\[(.+?)\\\]
,然后查看您能达到的程度…如果您计划匹配多于1的嵌套级别,正则表达式将变得非常笨拙。否则,请使用“(\\d+\\\[([^\\]\[]*(?:\[^\\]\[]\[]*[^\\]\[]*)]””
。它有效吗?还是需要更多嵌套级别的支持?@Darshan:我建议不要为此使用正则表达式。最好使用令牌解析器,因为您处理的是嵌套括号。@WiktorStribiżew恐怕需要更多的嵌套级别。所以,我会按照anubhava的建议使用令牌解析器。不可能,lazy dot会匹配3[r2[g]
中的3[r2[g]
。好吧-那么regex不是答案