我想知道我是否正在以.
正确的方式分割字符串?我的代码是:
String[] fn = filename.split(".");
return fn[0];
我只需要字符串的第一部分,这就是我返回第一项的原因。我问,因为我在API中注意到.
表示任何角色,所以现在我被卡住了。
答案 0 :(得分:155)
split()
接受正则表达式,因此您需要转义.
以将其视为正则表达式元字符。这是一个例子:
String[] fn = filename.split("\\.");
return fn[0];
答案 1 :(得分:16)
Split使用正则表达式,其中'。'是一个特殊的角色意味着什么。如果你真的希望它与''匹配,你需要逃避它。字符:
String[] fn = filename.split("\\.");
(一个'\'来逃避正则表达式中的'。',另一个''来逃避Java字符串中的第一个)
此外我不建议返回fn [0]因为如果你有一个名为something.blabla.txt
的文件,这是一个有效名称,你将不会返回实际的文件名。相反,我认为如果你使用它会更好:
int idx = filename.lastIndexOf('.');
return filename.subString(0, idx);
答案 2 :(得分:14)
String#split(String)方法使用正则表达式。 在正则表达式中,“。”字符表示“任何字符”。 你可以通过转义“。”来避免这种行为。
filename.split("\\.");
或告诉split方法在字符类中拆分:
filename.split("[.]");
字符类是字符集合。你可以写
filename.split("[-.;ld7]");
和文件名将在每个“ - ”,“。”,“;”,“l”,“d”或“7”分开。里面的字符类,“。”不是特殊字符(“元字符”)。
答案 3 :(得分:13)
我在这里只看到解决方案,但没有对问题的完整解释,所以我决定发布这个答案
您需要了解text.split(delim)
的一些事情。 split
方法:
delim
末尾的text
与[{1}}中的a,b,c,,
类似(其中分隔符为,
)split
首先会创建类似["a" "b" "c" "" ""]
的数组但是因为在大多数情况下我们并不真正需要这些尾随的空字符串,所以它也会自动为我们删除它们。所以它创建另一个没有这些尾随空字符串的数组并将其返回。您还需要知道正则表达式中dot .
为special character。它表示 任何字符 (行分隔符除外,但可以使用Pattern.DOTALL
标志进行更改。)
对于像"abc"
这样的字符串,如果我们在"."
split
方法上进行拆分,
["" "" "" ""]
,这意味着我们将得到空数组[]
(没有元素,甚至不是空字符串),所以我们不能使用fn[0]
,因为没有索引0。
要解决此问题,您只需创建代表点的正则表达式。为此,我们需要逃避.
。有几种方法可以做到这一点,但最简单的可能是使用\
(在String中需要将其写为"\\"
,因为\
在那里也很特殊,需要另一个\
逃脱)。
因此,您的问题的解决方案可能看起来像
String[] fn = filename.split("\\.");
<强>加成强>
您还可以使用其他方式来逃避该点,如
split("[.]")
split("\\Q.\\E")
Pattern.LITERAL
标志split(Pattern.quote("."))
让正则表达式为您逃脱。答案 4 :(得分:6)
由于DOT(。)被认为是一个特殊字符,而String的split方法需要一个正则表达式,你需要这样做 -
String[] fn = filename.split("\\.");
return fn[0];
在java中,需要使用“\”转义特殊字符,但由于“\”也是Java中的特殊字符,因此需要使用另一个“\”来转义它!
答案 5 :(得分:3)
String str="1.2.3";
String[] cats = str.split(Pattern.quote("."));
答案 6 :(得分:2)
使用
不是更有效率 filename.substring(0, filename.indexOf("."))
如果您只想要第一个点?
答案 7 :(得分:2)
通常手动揭开它并不是一个好主意。 Pattern任务中有一个方法可以执行此任务:
java.util.regex
static String quote(String s)
答案 8 :(得分:1)
分裂必须将正则表达式作为一个参数......只需将"."
更改为"\\."
答案 9 :(得分:0)
注意:即使摘除点后,也要对此片段进行进一步的保护!
如果filename仅是字符串“。”,则fn的长度仍为0,而fn [0]仍将引发异常!
这是因为,如果模式至少匹配一次,则split将从数组中丢弃所有结尾的空字符串(因此也将之前的一个空字符串!)! ,留下一个空数组要返回。
答案 10 :(得分:0)
对我有用的解决方案如下
filename.split(“ [。]”);
答案 11 :(得分:0)
使用 ApacheCommons 最简单:
File file = ...
FilenameUtils.getBaseName(file.getName());
注意,它还会从完整路径中提取文件名。
答案 12 :(得分:-1)
split
以正则表达式作为参数。因此,您应该通过"\."
而不是"."
,因为"."
是正则表达式中的元字符。