按括号中的所有空格拆分字符串

可能重复:
根据正则表达式拆分字符串

我从来不是一名正规表达大师,所以我需要你的帮助! 我有一个像这样的字符串:

String s = "a [bc] d [efg]"; 

我想使用空格作为分隔符来拆分此字符串 – 但我不想拆分出现在[]括号内的空格。 所以,从上面的例子中,我想要这个数组:

 {"a", "[bc]", "d", "[efg]"} 

关于什么正则表达式可以与split一起使用的任何建议,以实现这一目标?


这是另一个例子:

 "[ab] c [[de] fg]" 

 {"[ab]", "c", "[[de] fg]"} 

我认为这应该工作,使用负向前瞻 – 它匹配没有开括号的关闭括号之前的空格:

 "a [bc] d [efg]".split("\\s+(?![^\\[]*\\])"); 

对于嵌套括号,您需要编写一个解析器,正则表达式无法承受无限级别,并且对于超过一个或两个级别而言过于复杂。 我的表达例如失败了

 "[ab [cd] e] fg" 

单个正则表达式无法做到这一点,因为它无法匹配打开/关闭大括号并处理嵌套大括号。

正则表达式并不完美,所以即使它看起来有效,也会出现无法完成的情况。

因此,我宁愿建议您编写自己的几行代码,这些代码肯定会处理所有情况。

您可以为JavaCC或AntLR创建非常简单的语法,或使用简单的基于堆栈的解析器。

正如在其他答案中所说,你需要一个解析器。 这里的字符串与以前的正则表达式解决方案失败。

 "[ab] c [a [de] fg]" 

编辑:

 public static List split(String s){ List l = new LinkedList(); int depth=0; StringBuilder sb = new StringBuilder(); for(int i=0; i 

如果我正确理解你的问题,那么答案可能就是遵循规则4。

 rule1 -> ((az).(\w))*.(az) rule2 -> ([).rule1.(]) rule3 -> ([).(rule1.(\w))*.rule2.((\w).rule1)*.(]) rule4 -> rule1 | rule3 

对于没有巢

 \\s+(?![^\\[]*\\]) 

for NESTED ([] in [])

 (?