以点为分隔符拆分字符串

我想知道我是否正确地在 .上分解字符串? 我的代码是:

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

I only need the first part of the string, that's why I return the first item. I ask because I noticed in the API that . means any character, so now I'm stuck.

92405 次浏览

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

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

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

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

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

filename.split("\\.");

or telling the split method to split at at a character class:

filename.split("[.]");

字符类是字符的集合

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

和文件名将在每个“-”,“拆分。”“ ,”,“ l”,“ d”或“7”。在字符类内部,“不是特殊字符(“元字符”)。

如果我们能利用

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

if you only want what's up to the first dot?

Split 使用正则表达式,其中’是一个特殊的字符,意味着任何东西。如果你真的想要它匹配’,你需要逃避它性格:

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

(一个’逃避’在正则表达式中,另一个转义 Java 字符串中的第一个)

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

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

作为 DOT (.)被认为是一个特殊的字符,String 的拆分方法需要一个正则表达式,您需要这样做-

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

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

通常情况下,用手揭开面具并不是一个好主意。在 Pattern 类中有一个用于此任务的方法:

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

I see only solutions here but no full explanation of the problem so I decided to post this answer

问题

你需要知道一些关于 text.split(delim)的事情。 split方法:

  1. 接受参数 正则表达式(regex) ,它描述要拆分的分隔符,
  2. 如果 delima,b,c,,一样存在于 text的末尾(其中分隔符是 ,) ,split首先会像 ["a" "b" "c" "" ""]一样创建数组,但是因为在大多数情况下我们并不真正需要这些尾随的空字符串,它也会为我们自动删除它们。所以它创造了 another array without these trailing empty strings and returns it

您还需要知道 .正则表达式中的 special character。它表示 any character(除了行分隔符,但这可以通过 Pattern.DOTALL标志更改)。

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

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

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

解决方案

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

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

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

意外收获

You can also use other ways to escape that dot like

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

注意: 应该进一步注意这个片段,即使在点被转义之后!

如果文件名只是字符串“,那么 fn 最终仍然是0长度,fn [0]仍然会抛出异常!

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

String str="1.2.3";
String[] cats = str.split(Pattern.quote("."));

对我起作用的解决方案如下

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

使用 ApacheCommons是最简单的:

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

注意,它还从 full path 中提取文件名。