如何使用正则表达式将字符串按“,”分割,除非“,”在括号内?

12

编辑:有人能帮我写一个针对这种字符串的正则表达式吗?:

[Header 1],[Head,er 2],Header 3

以便我可以将其拆分为如下块:

[Header 1]
[Head,er 2]
Header 3

我已经实现了这么多:

(?<=,|^).*?(?=,|$)

这将给我:

[标题1]
[标题2]
[标题3]


世界需要多少个CSV实现? - Joachim Sauer
这是一个作业问题吗?因为我觉得最简单的方法就是使用基本的字符操作:对于每个字符,如果该字符是逗号并且不在括号内,则将当前字符串添加到列表中。 - Lucas Jones
6个回答

23
在这种情况下,按分隔符(逗号)拆分比匹配标记(或块)更容易。识别作为分隔符的逗号需要进行相对简单的先行查找:
,(?=[^\]]*(?:\[|$))
每当你找到一个逗号时,你需要向前查找三种情况之一。如果你先找到了一个闭合方括号,则该逗号位于方括号对内部,因此它不是分隔符。如果你发现一个开放的方括号或者行/字符串的末尾,则它是一个分隔符。

只要没有嵌套的括号,它就可以完美地工作。例如,对于[a],[b],[c[d,e]]可以像预期的那样工作,但在[a],[b],[c,[d,e]]中失败了。在最后一个示例中匹配了c旁边的逗号。如何改进它,使其不匹配那个逗号? - matte
实际上,更精确地说,对于[a],[b,[]],它匹配的是b后面的逗号。如果在[]中有任何开放方括号,则此模式将匹配括号中的逗号。 - matte
我有一个快速问题...为什么 "this is me".split(/(\s)/);"this is me".split(/\s/); 不同。例如,只是在分割方面不同,而不是在.match 中。JS。 - Muhammad Umer
当分割正则表达式包含捕获组时,被捕获的部分被视为标记并包含在结果中。 - Alan Moore
那很好。当你有一把锤子时,所有东西看起来都像钉子,我开始在到处看到 NotThis|(CaptureThis),但这里不需要,你在这里选择逗号是快速和高效的。 :) - zx81
显示剩余2条评论

6
\[.*?\]

忘记逗号,你不用在意它们。 :)

现在我有点困惑了。它真的是说“Header”还是占位符?方括号真的存在还是可选的?现在已经变得混乱,不确定哪些是有效的输入字符串。 - JP Alioto
抱歉更改了它,有效的输入字符串为[一些文本],更多的文本,[仍然有更多的文本]...拆分成[一些文本]/更多的文本/ [仍然有更多的文本]。 - Nate

2

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

利用[]分隔符来更好地使用它们。


1

这难道不是很简单吗?

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

当我使用您的正则表达式时,从开发工具中得到以下内容:regex = /(?<=,|^)(?:[^,]|\[[^[]*\])*/ SyntaxError: Invalid regular expression: /(?<=,|^)(?:[^,]|\[[^[]*\])*/: Invalid group - starbeamrainbowlabs

1
你可以使用正则表达式来匹配括号内的值:
\[[^\]*]\]

你可以使用这个正则表达式来分割括号列表(使用环视断言):
(?<=]|^)\s*,\s*(?=\[|$)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接