4

当我在 python 中拆分字符串时,相邻的空格分隔符被合并:

>>> str = "hi              there"
>>> str.split()
['hi', 'there']

在 Java 中,分隔符不被合并:

$ cat Split.java
class Split {
    public static void main(String args[]) {
        String str = "hi              there";
        String result = "";
        for (String tok : str.split(" "))
            result += tok + ",";
        System.out.println(result);
    }
}
$ javac Split.java ; java Split
hi,,,,,,,,,,,,,,there,

有没有一种直接的方法可以在 java 中获取 python 空间拆分语义?

4

5 回答 5

8

String.split接受一个正则表达式,因此提供一个匹配相邻空格的正则表达式:

str.split("\\s+")

如果您想模拟 Python 的确切行为str.split(),您还需要修剪:

str.trim().split("\\s+")

引用Python 文档str.split()

如果sep未指定或为None,则应用不同的拆分算法:连续空格的运行被视为单个分隔符,如果字符串具有前导或尾随空格,则结果将在开头或结尾不包含空字符串。因此,使用None分隔符拆分空字符串或仅包含空格的字符串将返回 []。

所以上面仍然不是一个完全等价的,因为它会返回['']空字符串,但它可能适合你的目的:)

于 2012-04-09T21:15:56.713 回答
1

Niklas B. 的答案的问题在于trim它对空白有自己的定义,即任何代码不超过'\u0020'. 以下应该足够接近 Python 版本,包括对空字符串的修复:

class TestSplit {

    private static final String[] EMPTY = {};

    private static String[] pySplit(String s) {
        s = s.replaceAll("^\\s+", "").replaceAll("\\s+$", "");
        if (s.isEmpty()) return EMPTY;
        return s.split("\\s+");
    }
}
于 2014-09-02T16:43:00.903 回答
1

改为使用str.split("\\s+")。这将满足您的需求。

于 2012-04-09T21:16:10.797 回答
1

Java 使用 Regex 进行拆分。

所以在一个空间上分割绝对会给你很多数组元素。

Python 拆分、ltrims 和 rtrims,然后在没有传递参数时将空格运行到单个空格中。

所以它会更合适

"my             string".trim().split("\\s+"); 
于 2012-04-09T21:18:44.350 回答
0

在 java 中,String.split 采用正则表达式。所以你可以做得到str.split(" +")python语义。

于 2012-04-09T21:16:10.103 回答