【问题标题】:Python split semantics in JavaJava中的Python拆分语义
【发布时间】:2012-04-22 05:23:34
【问题描述】:

当我在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 空间分割语义?

【问题讨论】:

    标签: java python regex split spaces


    【解决方案1】:

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

    str.split("\\s+")
    

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

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

    引用自Python docs on str.split()

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

    所以上面的内容仍然不是完全等价的,因为它会为空字符串返回[''],但对于您的目的来说可能没问题:)

    【讨论】:

    • 谢谢。我很难弄清楚文档中正则表达式的语法:docs.oracle.com/javase/6/docs/api/java/lang/…
    • @Andrew:了解正则表达式的更好地方是regular-expressions.info :)
    • 这不是一般的正则表达式,而是 Java 中的正则表达式让我感到困惑。我一直在尝试“*”,但失败得很惨。
    • @Andrew:这实际上是一个正则表达式问题,因为该模式匹配空字符串。在我知道的每个正则表达式实现中,对空字符串进行拆分会为您提供所有字符作为单独的匹配项:)
    • 阅读 en.wikipedia.org/wiki/Regular_expression,似乎 Java 使用 Perl 风格的 RE,而大多数 UNIX 实用程序使用 POSIX RE。
    【解决方案2】:

    在 java 中,String.split 采用正则表达式。所以你可以通过str.split(" +") 来获取python语义。

    【讨论】:

    • 不,这对于像foo\tbar这样的字符串不太一样
    • @NiklasB。好的我明白了。 OP要求拆分()而不是拆分('')
    • 好吧,这个问题专门询问了“空格分隔符”和“空格分割语义”,而不是“空格分隔符”或“空格分割语义”,所以在过于迂腐的意义上,空格 cmets 是奖金不是原始问题的一部分。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      Java 使用 Regex 进行拆分。

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

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

      这样更合适

      "my             string".trim().split("\\s+"); 
      

      【讨论】:

      • 不,这对于像foo\tbar这样的字符串不太一样
      • 对,但那不是什么时候出现的:) 已经出现的是 foo bar。不是 foo\tbar。 :)
      • 问的内容等同于 Python 中的 split(),而您的示例不是。
      • uhhh “如果可选的第二个参数 sep 不存在或无,空白字符的运行将被单个空格替换,并且前导和尾随空格被删除”很抱歉,让我们这样做。 rtrim、ltrim,然后是 "+" ;) 这正是上面所说的。
      • Mike:对,没有考虑修剪部分。不过,空格不仅仅包含空格字符 (ASCII 0x20)
      【解决方案5】:

      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+");
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-19
        • 1970-01-01
        • 1970-01-01
        • 2019-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多