Java相当于python的String分区

时间:2010-06-23 10:18:27

标签: java python string split

Java的字符串拆分(regex)函数在正则表达式的所有实例中拆分。 Python的分区函数仅在给定分隔符的第一个实例处拆分,并返回{left,separator,right}的元组。

如何实现Java中的分区功能?

e.g。

"foo bar hello world".partition(" ")

应该成为

"foo", " ", "bar hello world"
  • 是否有外部库 是否已提供此实用程序?

  • 如果没有,我将如何实现它 外部图书馆?

  • 如果没有外部库且没有Regex,可以实现吗?

NB。我不是在寻找split(“”,2),因为它不会返回分隔符。

5 个答案:

答案 0 :(得分:5)

虽然不是完全你想要的东西,但是second version of split有一个“限制”参数,告诉它将字符串拆分成的最大分区数。

所以如果你打电话(用Java):

"foo bar hello world".split(" ", 2);

你得到阵列:

["foo", "bar hello world"]

这或多或少是你想要的,除了分隔符没有嵌入索引1的事实。如果真的需要这最后一点,你需要这样做你自己,但希望你特别想要的就是限制分裂数量的能力。

答案 1 :(得分:5)

String.split(String regex, int limit)接近你想要的。来自文档:

  

limit参数控制模式的应用次数,因此会影响结果数组的长度。

     
      
  • 如果限制n大于零,那么模式将最多应用n - 1次,数组的长度不会超过n,并且数组的最后一个条目将包含超出最后匹配分隔符的所有输入。
  •   
  • 如果n是非正数,那么模式将被应用尽可能多次,并且数组可以具有任何长度。      
        
    • 如果n为零,则模式将被应用尽可能多次,数组可以具有任意长度,尾随空字符串将被丢弃。
    •   
  •   

以下是展示这些差异的示例(as seen on ideone.com):

static void dump(String[] ss) {
    for (String s: ss) {
        System.out.print("[" + s + "]");
    }
    System.out.println();
}
public static void main(String[] args) {
    String text = "a-b-c-d---";

    dump(text.split("-"));
    // prints "[a][b][c][d]"

    dump(text.split("-", 2));
    // prints "[a][b-c-d---]"

    dump(text.split("-", -1));
    // [a][b][c][d][][][]

}

保留分隔符的分区

如果您需要与分区类似的功能,并且您还希望获得与任意模式匹配的分隔符字符串,则可以使用Matcher,然后在适当的索引处使用substring

以下是一个示例(as seen on ideone.com):

static String[] partition(String s, String regex) {
    Matcher m = Pattern.compile(regex).matcher(s);
    if (m.find()) {
        return new String[] {
            s.substring(0, m.start()),
            m.group(),
            s.substring(m.end()),
        };
    } else {
        throw new NoSuchElementException("Can't partition!");
    }
}
public static void main(String[] args) {
    dump(partition("james007bond111", "\\d+"));
    // prints "[james][007][bond111]"
}

正则表达式\d+当然是重复一次或多次(\d)的任何数字字符(+)。

答案 2 :(得分:2)

这个怎么样:

String partition(String string, String separator) {
    String[] parts = string.split(separator, 2);
    return new String[] {parts[0], separator, parts[1]};
}

顺便说一下,你必须在此处添加一些输入/结果检查:)

答案 3 :(得分:0)

使用:

"foo bar hello world".split(" ",2)

默认情况下,分隔符是空格

答案 4 :(得分:0)

  

是否有外部库提供此实用程序?

我不知道。

  

如果没有外部库,我将如何实现它?   如果没有外部库并且没有正则表达式,它可以实现吗?

当然,这根本不是问题;只需使用String.indexOf()String.substring()。但是,Java没有元组数据类型,因此您必须返回一个数组,List或编写自己的结果类。