匹配逗号分隔列表中的组,忽略括号中的逗号

时间:2014-11-13 19:45:25

标签: java regex coldfusion

我正在使用以下字符串:

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]

到目前为止,我已经能够正确匹配逗号了。然而,这与我实际需要的相反。我一直在使用的正则表达式是:

(,(?![^\[]*]))

有关如何重写此内容以获取当前结果的反转的任何建议?

http://regexr.com/39tb0

5 个答案:

答案 0 :(得分:2)

好的,你走了:

(?:[^\]\[,]+|\[[^\]\[]+\])+

这是regex demo。你可以找到模式匹配:

Pattern pattern = Pattern.compile("(?:[^\\]\\[,]+|\\[[^\\]\\[]+]\])+");
Matcher matcher = pattern.matcher(str);
while (matcher.find())
    System.out.println(matcher.group());

这匹配所有不包含逗号或方括号的序列。当我们来到方括号时,该组交替到右侧,它匹配方括号之间的所有内容,并返回到左侧以匹配下一个逗号的所有内容,冲洗并重复,有效地断言匹配而不会发生一个不合格的逗号。

这是jdoodle code demo

答案 1 :(得分:1)

您可以使用这个基于前瞻性的正则表达式:

,(?![^\]\[]*\])

RegEx Demo

(?![^\]\[]*\])是负面预测,通过确保逗号后面没有“0个或更多非方括号字符后跟”,确保逗号不在[]]”。

答案 2 :(得分:1)

要查找没有前导和尾随空格的项目,并允许空项目,您可以使用:

(?=[^\s,])(?: ?[^[\s,]+|\[[^]]*])*|(?<=,|^)(?=\s*(?:,|$))

答案 3 :(得分:1)

这种方法怎么样?

(?:([^,\[]*\[[^\]]*\])(?:,|$))|([^,\[\]]+(?:,|$))

http://regexr.com/39tbr

该模式由两个替代模式匹配组成,一个带括号,另一个没有。 这也使用非捕获组?:用于锚定匹配和分组。 但是这两个捕获组应该与你想要的匹配。

从左到右阅读:

  1. 匹配除逗号或开放式括号外的任何内容,贪婪的匹配
  2. 匹配选项括号
  3. 匹配除了小括号之外的任何内容
  4. 匹配逗号或行尾
  5. 匹配除了commあ或开放式括号以外的任何内容,至少一个字符,贪婪的匹配
  6. 匹配逗号或行尾

答案 4 :(得分:1)

只是在这里折腾,因为我想看看我能想出什么

([^,]+\[[^\],]*,[^\],]*\]|[^,]+)