Java 匹配以逗号分隔的列表中的组,忽略括号中的逗号
我正在使用以下字符串:Java 匹配以逗号分隔的列表中的组,忽略括号中的逗号,java,regex,coldfusion,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] 到目前为止,我已经能够正确匹配逗号。然而,这与我实际需要的正好相反。我一
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]
到目前为止,我已经能够正确匹配逗号。然而,这与我实际需要的正好相反。我一直使用的正则表达式是:
(,(?![^\[]*]))
有什么建议可以让我重写它以获得与当前结果相反的结果吗
好了,给你:
?:[^\]\[,]+|\[[^\]\[]+\]+
这是一本书。您可以通过模式匹配找到:
Pattern pattern = Pattern.compile("(?:[^\\]\\[,]+|\\[[^\\]\\[]+]\])+");
Matcher matcher = pattern.matcher(str);
while (matcher.find())
System.out.println(matcher.group());
这匹配所有不包含逗号或方括号的序列。当我们遇到方括号时,该组交替到右侧,匹配方括号之间的所有内容,然后返回到左侧,将所有内容匹配到下一个逗号,冲洗并重复,有效地断言匹配,而不会出现不合格的逗号
以下是一个。您可以使用这个基于前瞻性的正则表达式:
,(?![^\]\[]*\])
?![^\]\[]*\]是负向前看,它将确保逗号不在[和]之内,方法是确保逗号后面没有0个或多个非方括号字符,后跟]。若要查找不带前导空格和尾随空格的项,并允许空项,可以使用以下方法:
(?=[^\s,])(?: ?[^[\s,]+|\[[^]]*])*|(?<=,|^)(?=\s*(?:,|$))
这个方法怎么样
(?:([^,\[]*\[[^\]]*\])(?:,|$))|([^,\[\]]+(?:,|$))
该模式由两个可选模式匹配组成,一个带括号,另一个不带括号。
这也使用非捕获组?:用于锚定匹配和分组。
但是,这两个捕获组应该与您正在寻找的匹配
从左到右阅读:
匹配除逗号或开括号外的任何内容,贪婪匹配
匹配选项括号
匹配除括号外的任何内容
匹配逗号或行尾
或
匹配除comm之外的任何内容あ 或开括号,至少一个字符,贪婪匹配
匹配逗号或行尾
把这个扔到这里是因为我想看看我能想出什么
([^,]+\[[^\],]*,[^\],]*\]|[^,]+)
非常感谢。此解决方案是完美的,即使在更大的测试场景中也是如此。同样好的是,它没有捕获括号为空的组。通过使方括号组可选,可以减少丰度。