我正在使用以下字符串:
required,something_here[arg1,arg2],hey_yo[abc=123], is_date,date_after[date1,date2]
我的目标是匹配用逗号分隔的组,但忽略括号内的逗号。最终结果将是:
required
something_here[arg1,arg2]
hey_yo[abc=123]
is_date
date_after[date1,date2]
到目前为止,我已经能够正确匹配逗号了。然而,这与我实际需要的相反。我一直在使用的正则表达式是:
(,(?![^\[]*]))
有关如何重写此内容以获取当前结果的反转的任何建议?
答案 0 :(得分:2)
好的,你走了:
(?:[^\]\[,]+|\[[^\]\[]+\])+
这是regex demo。你可以找到模式匹配:
Pattern pattern = Pattern.compile("(?:[^\\]\\[,]+|\\[[^\\]\\[]+]\])+");
Matcher matcher = pattern.matcher(str);
while (matcher.find())
System.out.println(matcher.group());
这匹配所有不包含逗号或方括号的序列。当我们来到方括号时,该组交替到右侧,它匹配方括号之间的所有内容,并返回到左侧以匹配下一个逗号的所有内容,冲洗并重复,有效地断言匹配而不会发生一个不合格的逗号。
答案 1 :(得分:1)
您可以使用这个基于前瞻性的正则表达式:
,(?![^\]\[]*\])
(?![^\]\[]*\])
是负面预测,通过确保逗号后面没有“0个或更多非方括号字符后跟”,确保逗号不在[
和]
内]
”。
答案 2 :(得分:1)
要查找没有前导和尾随空格的项目,并允许空项目,您可以使用:
(?=[^\s,])(?: ?[^[\s,]+|\[[^]]*])*|(?<=,|^)(?=\s*(?:,|$))
答案 3 :(得分:1)
这种方法怎么样?
(?:([^,\[]*\[[^\]]*\])(?:,|$))|([^,\[\]]+(?:,|$))
该模式由两个替代模式匹配组成,一个带括号,另一个没有。 这也使用非捕获组?:用于锚定匹配和分组。 但是这两个捕获组应该与你想要的匹配。
从左到右阅读:
答案 4 :(得分:1)
只是在这里折腾,因为我想看看我能想出什么
([^,]+\[[^\],]*,[^\],]*\]|[^,]+)