Java正则表达式:拆分不在字符串开头的“/”

时间:2011-08-09 14:21:39

标签: java regex

我想将a/bc/de/f分割为[a, bc, de, f],将/a/bc/de/f分割为[/a, bc, de, f]

有没有办法在不在字符串开头的/上拆分? (我的Regexp日很糟糕。)

3 个答案:

答案 0 :(得分:10)

(?!^)/似乎有效:

public class Funclass{
    public static void main(String [] args) {
        String s = "/firstWithSlash/second/third/forth/fifth/";
        String[] ss = s.split("(?!^)/");
        for (String s_ : ss)
            System.out.println(s_);

    }
}

输出:

/firstWithSlash
second
third
forth
fifth

正如 @user unknown 所评论的那样,这似乎是一个错误的表达式,它应该是(?<!^)/来表示负面的背后隐藏。

答案 1 :(得分:3)

难道你不能在开头添加一张支票,看看开头是否有斜线?

if( str.charAt(0) == '/' ) {
    arr = str.substring(1).split( "/" );
    arr[0] = "/"+arr[0];
} else
    arr = str.split( "/" );

或者更简单一点:

arr = str.charAt(0) + str.substring(1).split( "/" );

如果第一个是斜杠,它只会在第一个标记开头的斜杠上打一针。如果第一个标记中只有一个字符(不是以斜杠开头),那么第一个数组元素就是空字符串,它仍然可以工作。

答案 2 :(得分:3)

最简单的解决方案可能只是在s.substring(1)上拆分/,然后将s.charAt(0)添加到第一个结果中。

除此之外,由于拆分正则表达式没有锚定,因此这样做很有挑战性。你想要拆分“不是行的开头,然后是斜线”的东西 - 即[^^ ]/ - 但这意味着斜杠前面的字符也被剥离了。为了做到这一点,你需要负面的后视,但我不认为String.split正则表达式支持这种语法。

编辑:根据Pattern javadocs,似乎Java 确实支持负面反对,并且以下正则表达式可以完成这项工作:

s.split("(?<!^)/");

快速测试表明这确实可以满足您的需求。