【问题标题】:Split string with dot as delimiter以点为分隔符拆分字符串
【发布时间】:2011-03-24 04:34:40
【问题描述】:

我想知道我是否要以正确的方式在. 上拆分字符串?我的代码是:

String[] fn = filename.split(".");
return fn[0];

我只需要字符串的第一部分,这就是我返回第一项的原因。我问是因为我在 API 中注意到 . 表示任何字符,所以现在我被卡住了。

【问题讨论】:

    标签: java regex string split


    【解决方案1】:

    split() 接受正则表达式,因此您需要转义 . 以不将其视为正则表达式元字符。这是一个例子:

    String[] fn = filename.split("\\."); 
    return fn[0];
    

    【讨论】:

      【解决方案2】:

      我在这里只看到解决方案,但没有对问题的完整解释,所以我决定发布这个答案

      问题

      您需要了解一些关于text.split(delim) 的信息。 split方法:

      1. 接受作为参数正则表达式(正则表达式),它描述了我们想要分割的分隔符,
      2. 如果delim 存在于text 的末尾,例如a,b,c,,(其中分隔符是,),split 最初将创建类似["a" "b" "c" "" ""] 的数组,但因为在大多数情况下我们并不真正需要这些尾随的空字符串也会自动为我们删除它们。所以它会创建另一个没有这些尾随空字符串的数组并返回它

      您还需要知道dot .regex 中是special character。它代表任何字符(行分隔符除外,但可以使用Pattern.DOTALL 标志更改)。

      所以对于像"abc" 这样的字符串,如果我们在"." 上拆分split 方法将

      1. 创建类似["" "" "" ""]的数组,
      2. 但是由于这个数组只包含空字符串并且它们都在尾随它们将被删除(如前面的第二点所示)

      这意味着我们将得到空数组[](没有元素,甚至没有空字符串),所以我们不能使用fn[0],因为没有索引0。

      解决方案

      要解决这个问题,您只需创建表示点的正则表达式。为此,我们需要转义 .。有几种方法可以做到这一点,但最简单的可能是使用\(在String中需要写成"\\",因为\在那里也很特殊,需要另一个\进行转义)。

      所以你的问题的解决方案可能看起来像

      String[] fn = filename.split("\\.");
      

      奖金

      您还可以使用其他方式来转义该点,例如

      • 使用字符类split("[.]")
      • 将其包装在 引用 split("\\Q.\\E")
      • 使用带有Pattern.LITERAL 标志的正确模式实例
      • 或者干脆使用split(Pattern.quote(".")),让正则表达式为你转义。

      【讨论】:

      • 这个..我真的很喜欢:split("[.]")
      【解决方案3】:

      Split 使用正则表达式,其中 '.'是一个特殊字符,表示任何东西。如果您确实希望它与“。”匹配,则需要对其进行转义。人物:

      String[] fn = filename.split("\\.");
      

      (一个'\'转义正则表达式中的'.',另一个转义Java字符串中的第一个)

      另外,我不建议返回 fn[0],因为如果您有一个名为 something.blabla.txt 的文件,这是一个有效的名称,您将不会返回实际的文件名。相反,我认为最好使用:

      int idx = filename.lastIndexOf('.');
      return filename.subString(0, idx);
      

      【讨论】:

      • 问题被标记为 Java,而不是 Javascript,这是您链接到的。
      【解决方案4】:

      String#split(String) 方法使用正则表达式。 在正则表达式中,“.”字符的意思是“任何字符”。 您可以通过转义“。”来避免这种行为

      filename.split("\\.");
      

      或告诉 split 方法在字符类处拆分:

      filename.split("[.]");
      

      字符类是字符的集合。你可以写

      filename.split("[-.;ld7]");
      

      并且文件名将在每个“-”、“.”、“;”、“l”、“d”或“7”处分割。在字符类中,“.”不是特殊字符(“元字符”)。

      【讨论】:

      • @MisterSmith 你可能想看看这里的编程语言。我们在谈论 java,而不是 javascript。
      • 你是绝对正确的。昨天我很累,用两种语言编码,没有注意到 Java 数据类型。我想也许答案在 2010 年是正确的,但不知何故,今天的浏览器以不同的方式表现。
      【解决方案5】:

      由于 DOT( . ) 被视为特殊字符,String 的 split 方法需要一个正则表达式,您需要这样做 -

      String[] fn = filename.split("\\.");
      return fn[0];
      

      在java中,特殊字符需要用“\”转义,但由于“\”在Java中也是一个特殊字符,你需要用另一个“\”再次转义!

      【讨论】:

        【解决方案6】:
        String str="1.2.3";
        String[] cats = str.split(Pattern.quote("."));
        

        【讨论】:

          【解决方案7】:

          使用起来会不会更有效率

           filename.substring(0, filename.indexOf("."))
          

          如果您只想要第一个点之前的内容?

          【讨论】:

            【解决方案8】:

            通常手动揭开它不是一个好主意。 Pattern 类中有一个方法可以完成这个任务:

            java.util.regex
            static String quote(String s) 
            

            【讨论】:

              【解决方案9】:

              拆分必须将正则表达式作为参数...只需将 "." 更改为 "\\."

              【讨论】:

                【解决方案10】:

                注意:这个 sn-p 应该更加小心,即使在点被转义之后!

                如果文件名只是字符串“.”,那么 fn 的长度仍然为 0,并且 fn[0] 仍然会抛出异常!

                这是因为如果模式至少匹配一次,则 split 将从数组中丢弃所有尾随的空字符串(因此也是 在点之前的那个!) ,留下一个空数组返回。

                【讨论】:

                • 在当前情况下最简单的解决方案是将限制参数 2 传递给 split 调用: String[] fn = filename.split("[.]",2) ;
                【解决方案11】:

                对我有用的解决方案如下

                文件名.split("[.]");

                【讨论】:

                  【解决方案12】:

                  使用 ApacheCommons 最简单:

                  File file = ...
                  FilenameUtils.getBaseName(file.getName());
                  

                  注意,它还会从完整路径中提取文件名。

                  【讨论】:

                    【解决方案13】:

                    split 将正则表达式作为参数。所以你应该传递"\." 而不是".",因为"." 是正则表达式中的元字符。

                    【讨论】:

                    • 必须是“\\.”不是“\。”
                    猜你喜欢
                    • 2014-06-29
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-12-28
                    • 1970-01-01
                    相关资源
                    最近更新 更多