以点为分隔符分割字符串


99

我想知道我是否打算.以正确的方式分割字符串?我的代码是:

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

我只需要字符串的第一部分,这就是为什么我返回第一项的原因。我问是因为我在API中注意到这.意味着任何字符,所以现在我陷入了困境。

Answers:



17

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

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

(一个“ \”用于转义正则表达式中的“。”,另一个用于转义Java字符串中的第一个)

我也不建议返回fn [0],因为如果您有一个名为的文件something.blabla.txt,这是一个有效的名称,那么您将不会返回实际的文件名。相反,我认为使用以下方法会更好:

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

问题被标记为Java,而不是Javascript,这是您链接的对象。
Andrei Fierbinteanu

17

我在这里仅看到解决方案,但没有对该问题的完整解释,因此我决定发布此答案

问题

您需要了解的一些知识text.split(delim)split方法:

  1. 接受描述要分割的定界符作为参数的正则表达式(regex),
  2. 如果delimtextlike in a,b,c,,(其中delimiter是,)的末尾存在,split则会首先创建like,["a" "b" "c" "" ""]但由于在大多数情况下我们实际上并不需要这些尾随的空字符串,因此也会为我们自动删除它们。因此,它创建了另一个没有这些尾随空字符串的数组并将其返回

你还需要知道.特殊字符正则表达式。它代表任何字符(行分隔符除外,但可以用Pattern.DOTALL标志更改)。

所以对于像"abc"我们拆分"." split方法这样的字符串

  1. 创建阵列状["" "" "" ""]
  2. 但由于此数组仅包含空字符串,并且它们都在结尾,因此它们将被删除(如前第二点所示)

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

为了解决这个问题,您只需要创建代表点的正则表达式即可。为此,我们需要避免这种情况.。做到这一点的方法很少,但最简单的方法可能是使用\(在String中需要编写它,"\\"因为\在那儿也很特殊,并且需要\转义另一个)。

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

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

奖金

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

  • 使用角色类 split("[.]")
  • 将其包装在报价中 split("\\Q.\\E")
  • 使用带有Pattern.LITERAL标志的适当Pattern实例
  • 或者只是使用split(Pattern.quote("."))并让regex为您转义。

这个..我真的很喜欢: split("[.]")
Dragonborn

15

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

filename.split("\\.");

或告诉split方法在一个字符类处进行分割:

filename.split("[.]");

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

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

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


@MisterSmith您可能想在这里看看编程语言。我们说的是Java,而不是JavaScript。
2013年

你是绝对正确的。昨天我很累,因为同时使用两种语言进行编码,所以没有注意到Java数据类型。我认为答案可能在2010年是正确的,但如今的浏览器却以不同的方式表现出来。
史密斯先生

7

由于DOT(。)被视为特殊字符,并且String的split方法期望您需要像这样执行正则表达式-

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

在Java中,特殊字符需要用“ \”进行转义,但是由于“ \”在Java中也是特殊字符,因此您需要再次用另一个“ \”对其进行转义!



2

使用起来不是更有效吗

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

如果您只想知道第一个点是什么?


2

通常,用手揭开它不是一个好主意。Pattern类中有一个用于此任务的方法:

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


0

注意:即使摘除点后,也应格外小心!

如果filename仅是字符串“。”,则fn的长度仍为0,而fn [0]仍将引发异常!

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


在诸如此类的情况下,最简单的解决方案是还将限制参数2传递给split调用:String [] fn = filename.split(“ [。]”,2);
avl42


0

使用ApacheCommons最简单:

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.