我从未成为正规表达大师,所以我需要你的帮助!我有一个这样的字符串:
String s = "a [b c] d [e f g]";
我想使用空格作为分隔符来拆分此字符串 - 但我不想拆分出现在[]
括号内的空格。所以,从上面的例子中,我想要这个数组:
{"a", "[b c]", "d", "[e f g]"}
关于什么正则表达式可以与split
一起使用以实现此目的的任何建议?
这是另一个例子:
"[a b] c [[d e] f g]"
变为
{"[a b]", "c", "[[d e] f g]"}
答案 0 :(得分:10)
我认为这应该可行,使用negative lookahead - 它不会在没有左括号的情况下关闭括号之前的空格:
"a [b c] d [e f g]".split("\\s+(?![^\\[]*\\])");
对于嵌套括号,您需要编写一个解析器,正则表达式无法承受无限级别,并且对于超过一个或两个级别而言过于复杂。例如,我的表达式因
而失败"[a b [c d] e] f g"
答案 1 :(得分:4)
单个正则表达式无法做到这一点,因为它无法匹配打开/关闭大括号并处理嵌套大括号。
正则表达不是完整的,所以即使它可能看起来有效,也会出现无法完成的情况。
所以我宁愿建议你自己编写几行代码来处理所有情况。
答案 2 :(得分:3)
正如其他答案中所说,你需要一个解析器。 这里的字符串在以前的正则表达式解决方案中失败。
"[a b] c [a [d e] f g]"
编辑:
public static List<String> split(String s){
List<String> l = new LinkedList<String>();
int depth=0;
StringBuilder sb = new StringBuilder();
for(int i=0; i<s.length(); i++){
char c = s.charAt(i);
if(c=='['){
depth++;
}else if(c==']'){
depth--;
}else if(c==' ' && depth==0){
l.add(sb.toString());
sb = new StringBuilder();
continue;
}
sb.append(c);
}
l.add(sb.toString());
return l;
}
答案 3 :(得分:0)
如果我理解你的问题,那么答案可能就是遵循规则4。
rule1 -> ((a-z).(\w))*.(a-z)
rule2 -> ([).rule1.(])
rule3 -> ([).(rule1.(\w))*.rule2.((\w).rule1)*.(])
rule4 -> rule1 | rule3
答案 4 :(得分:-1)
FOR NON NESTED
\\s+(?![^\\[]*\\])
FOR NESTED ([]内的[])
(?<!\\[[^\\]]*)\\s+(?![^\\[]*\\])