按括号中的所有空格拆分字符串
可能重复:
根据正则表达式拆分字符串
我从来不是一名正规表达大师,所以我需要你的帮助! 我有一个像这样的字符串:
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 [])
(?