用点作为分隔符分割string

我想知道如果我正在分裂一个string. 正确的方式? 我的代码是:

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

我只需要string的第一部分,这就是为什么我返回第一个项目。 我问,因为我注意到在API中. 意味着任何angular色,所以现在我卡住了。

split()接受一个正则expression式,所以你需要转义. 不认为它是一个正则expression的元字符。 这是一个例子:

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

Split使用正则expression式,其中'。' 是什么意思的特殊字符。 如果你真的希望它匹配'。',你需要逃避它。 字符:

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

(一个'\'在正则expression式中转义'。',另一个转义Javastring中的第一个)

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

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

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

 filename.split("\\."); 

或者告诉拆分方法在字符类中拆分:

 filename.split("[.]"); 

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

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

和文件名将在每个“ – ”,“。”,“;”,“l”,“d”或“7”分割。 在字符类里面,“。” 不是一个特殊的字符(“元字符”)。

我看到只有解决scheme,但没有解决问题的完整,所以我决定发表这个答案

问题

你需要知道一些关于text.split(delim)东西。 split方法:

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

你也需要知道这个点.正则expression式中的 特殊字符 。 它表示任何字符 (除了行分隔符,但可以使用Pattern.DOTALL标志来更改)。

所以像"abc"这样的string,如果我们分裂"." split方法会

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

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

要解决这个问题,你只需要创build表示点的正则expression式。 要做到这一点,我们需要逃避. 。 有几种方法可以做到这一点,但最简单的可能是通过使用\ (在String中需要写成"\\"因为\也是特殊的,并且需要另外的\被转义)。

所以解决您的问题可能看起来像

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

奖金

你也可以用其他的方法来逃避那个点

  • 使用字符类split("[.]")
  • 引号 split("\\Q.\\E")
  • 使用适当的Pattern实例与Pattern.LITERAL标志
  • 或简单地使用split(Pattern.quote(".")) ,让正则expression式为你逃跑。

由于DOT(。)被认为是一个特殊字符,String的分割方法需要一个正则expression式,所以你需要这样做 –

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

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

通常这不是一个好的主意。 Pattern类中有一个用于这个任务的方法:

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

分裂必须采取正则expression式作为一个论点…只需改变".""\\."

这不是更有效率的使用

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

如果你只想要怎么了第一个点?

split需要一个正则expression式作为参数。 所以你应该通过“。” 代替 ”。” 因为“。” 是正则expression式中的元字符。