【发布时间】:2011-03-24 04:34:40
【问题描述】:
我想知道我是否要以正确的方式在. 上拆分字符串?我的代码是:
String[] fn = filename.split(".");
return fn[0];
我只需要字符串的第一部分,这就是我返回第一项的原因。我问是因为我在 API 中注意到 . 表示任何字符,所以现在我被卡住了。
【问题讨论】:
我想知道我是否要以正确的方式在. 上拆分字符串?我的代码是:
String[] fn = filename.split(".");
return fn[0];
我只需要字符串的第一部分,这就是我返回第一项的原因。我问是因为我在 API 中注意到 . 表示任何字符,所以现在我被卡住了。
【问题讨论】:
split() 接受正则表达式,因此您需要转义 . 以不将其视为正则表达式元字符。这是一个例子:
String[] fn = filename.split("\\.");
return fn[0];
【讨论】:
我在这里只看到解决方案,但没有对问题的完整解释,所以我决定发布这个答案
您需要了解一些关于text.split(delim) 的信息。 split方法:
delim 存在于text 的末尾,例如a,b,c,,(其中分隔符是,),split 最初将创建类似["a" "b" "c" "" ""] 的数组,但因为在大多数情况下我们并不真正需要这些尾随的空字符串也会自动为我们删除它们。所以它会创建另一个没有这些尾随空字符串的数组并返回它。您还需要知道dot . 在regex 中是special character。它代表任何字符(行分隔符除外,但可以使用Pattern.DOTALL 标志更改)。
所以对于像"abc" 这样的字符串,如果我们在"." 上拆分split 方法将
["" "" "" ""]的数组,这意味着我们将得到空数组[](没有元素,甚至没有空字符串),所以我们不能使用fn[0],因为没有索引0。
要解决这个问题,您只需创建表示点的正则表达式。为此,我们需要转义 .。有几种方法可以做到这一点,但最简单的可能是使用\(在String中需要写成"\\",因为\在那里也很特殊,需要另一个\进行转义)。
所以你的问题的解决方案可能看起来像
String[] fn = filename.split("\\.");
奖金
您还可以使用其他方式来转义该点,例如
split("[.]")
split("\\Q.\\E")
Pattern.LITERAL 标志的正确模式实例split(Pattern.quote(".")),让正则表达式为你转义。【讨论】:
split("[.]")
Split 使用正则表达式,其中 '.'是一个特殊字符,表示任何东西。如果您确实希望它与“。”匹配,则需要对其进行转义。人物:
String[] fn = filename.split("\\.");
(一个'\'转义正则表达式中的'.',另一个转义Java字符串中的第一个)
另外,我不建议返回 fn[0],因为如果您有一个名为 something.blabla.txt 的文件,这是一个有效的名称,您将不会返回实际的文件名。相反,我认为最好使用:
int idx = filename.lastIndexOf('.');
return filename.subString(0, idx);
【讨论】:
String#split(String) 方法使用正则表达式。 在正则表达式中,“.”字符的意思是“任何字符”。 您可以通过转义“。”来避免这种行为
filename.split("\\.");
或告诉 split 方法在字符类处拆分:
filename.split("[.]");
字符类是字符的集合。你可以写
filename.split("[-.;ld7]");
并且文件名将在每个“-”、“.”、“;”、“l”、“d”或“7”处分割。在字符类中,“.”不是特殊字符(“元字符”)。
【讨论】:
由于 DOT( . ) 被视为特殊字符,String 的 split 方法需要一个正则表达式,您需要这样做 -
String[] fn = filename.split("\\.");
return fn[0];
在java中,特殊字符需要用“\”转义,但由于“\”在Java中也是一个特殊字符,你需要用另一个“\”再次转义!
【讨论】:
String str="1.2.3";
String[] cats = str.split(Pattern.quote("."));
【讨论】:
使用起来会不会更有效率
filename.substring(0, filename.indexOf("."))
如果您只想要第一个点之前的内容?
【讨论】:
通常手动揭开它不是一个好主意。 Pattern 类中有一个方法可以完成这个任务:
java.util.regex
static String quote(String s)
【讨论】:
拆分必须将正则表达式作为参数...只需将 "." 更改为 "\\."
【讨论】:
注意:这个 sn-p 应该更加小心,即使在点被转义之后!
如果文件名只是字符串“.”,那么 fn 的长度仍然为 0,并且 fn[0] 仍然会抛出异常!
这是因为如果模式至少匹配一次,则 split 将从数组中丢弃所有尾随的空字符串(因此也是 在点之前的那个!) ,留下一个空数组返回。
【讨论】:
对我有用的解决方案如下
文件名.split("[.]");
【讨论】:
使用 ApacheCommons 最简单:
File file = ...
FilenameUtils.getBaseName(file.getName());
注意,它还会从完整路径中提取文件名。
【讨论】:
split 将正则表达式作为参数。所以你应该传递"\." 而不是".",因为"." 是正则表达式中的元字符。
【讨论】: