我想知道我是否正确地在 .上分解字符串? 我的代码是:
.
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.
拆分必须将正则表达式作为参数... ... 只需将 "."更改为 "\\."
"."
"\\."
split()接受正则表达式,因此需要转义 .以避免将其视为正则表达式元字符。这里有一个例子:
split()
String[] fn = filename.split("\\."); return fn[0];
split接受正则表达式作为参数。因此应该传递 "\."而不是 ".",因为 "."是正则表达式中的元字符。
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的文件,这是一个有效的名称,您不会返回实际的文件名。相反,我认为最好使用:
something.blabla.txt
int idx = filename.lastIndexOf('.'); return filename.subString(0, idx);
作为 DOT (.)被认为是一个特殊的字符,String 的拆分方法需要一个正则表达式,您需要这样做-
在 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方法:
text.split(delim)
delim
a,b,c,,
text
,
["a" "b" "c" "" ""]
您还需要知道 点 .是 正则表达式中的 special character。它表示 any character(除了行分隔符,但这可以通过 Pattern.DOTALL标志更改)。
Pattern.DOTALL
所以对于像 "abc"这样的字符串,如果我们在 "."上拆分 split方法就会
"abc"
["" "" "" ""]
这意味着我们得到的结果是空数组 [](没有元素,甚至没有空字符串) ,所以我们不能使用 fn[0],因为没有索引0。
[]
fn[0]
要解决这个问题,您只需要创建表示点的正则表达式。要做到这一点,我们需要摆脱 .。有几种方法可以做到这一点,但最简单的方法可能是使用 \(在 String 中需要写成 "\\",因为 \在那里也是特殊的,需要另一个 \进行转义)。
\
"\\"
所以你的问题的解决方案可能看起来像
意外收获
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 中提取文件名。