除了括号中的空格以外的所有空格拆分字符串

时间:2012-10-14 17:14:47

标签: java regex

  

可能重复:
  Split a String based on regex

我从未成为正规表达大师,所以我需要你的帮助!我有一个这样的字符串:

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]"}

5 个答案:

答案 0 :(得分:10)

我认为这应该可行,使用negative lookahead - 它不会在没有左括号的情况下关闭括号之前的空格:

"a [b c] d [e f g]".split("\\s+(?![^\\[]*\\])");

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

而失败
"[a b [c d] e] f g"

答案 1 :(得分:4)

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

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

所以我宁愿建议你自己编写几行代码来处理所有情况。

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

答案 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+(?![^\\[]*\\])