用点作为分隔符分割string
我想知道如果我正在分裂一个string.
正确的方式? 我的代码是:
String[] fn = filename.split("."); return fn[0];
我只需要string的第一部分,这就是为什么我返回第一个项目。 我问,因为我注意到在API中.
意味着任何angular色,所以现在我卡住了。
split()
接受一个正则expression式,所以你需要转义.
不认为它是一个正则expression的元字符。 这是一个例子:
String[] fn = filename.split("\\."); return fn[0];
Split使用正则expression式,其中'。' 是什么意思的特殊字符。 如果你真的希望它匹配'。',你需要逃避它。 字符:
String[] fn = filename.split("\\.");
(一个'\'在正则expression式中转义'。',另一个转义Javastring中的第一个)
另外我不会build议返回fn [0],因为如果你有一个名为something.blabla.txt
的文件,这是一个有效的名字,你将不会返回实际的文件名。 相反,我认为如果你使用:
int idx = filename.lastIndexOf('.'); return filename.subString(0, idx);
String#split(String)方法使用正则expression式。 在正则expression式中,“。” 字符的意思是“任何字符”。 您可以通过转义“。”来避免此行为。
filename.split("\\.");
或者告诉拆分方法在字符类中拆分:
filename.split("[.]");
字符类是字符的集合。 你可以写
filename.split("[-.;ld7]");
和文件名将在每个“ – ”,“。”,“;”,“l”,“d”或“7”分割。 在字符类里面,“。” 不是一个特殊的字符(“元字符”)。
我看到只有解决scheme,但没有解决问题的完整,所以我决定发表这个答案
问题
你需要知道一些关于text.split(delim)
东西。 split
方法:
- 接受作为参数的正则expression式 (正则expression式),它描述了我们想要分割的分隔符,
- 如果在
text
结尾处存在delim
,如a,b,c,,
(其中分隔符是),则首先split
将创build类似["a" "b" "c" "" ""]
数组,但由于在大多数情况下,真的不需要这些尾随的空string,它也会自动为我们删除它们。 所以它会创build另一个没有这些尾随空string的数组并返回它 。
你也需要知道这个点.
是正则expression式中的 特殊字符 。 它表示任何字符 (除了行分隔符,但可以使用Pattern.DOTALL
标志来更改)。
所以像"abc"
这样的string,如果我们分裂"."
split
方法会
- 像
["" "" "" ""]
创build数组, - 但由于这个数组只包含空string,并且都是尾随的,所以它们将被删除(如前面第二点所示)
这意味着我们将得到结果为空数组[]
(没有元素,甚至没有空string),所以我们不能使用fn[0]
因为没有索引0。
解
要解决这个问题,你只需要创build表示点的正则expression式。 要做到这一点,我们需要逃避.
。 有几种方法可以做到这一点,但最简单的可能是通过使用\
(在String中需要写成"\\"
因为\
也是特殊的,并且需要另外的\
被转义)。
所以解决您的问题可能看起来像
String[] fn = filename.split("\\.");
奖金
你也可以用其他的方法来逃避那个点
- 使用字符类
split("[.]")
- 用引号
split("\\Q.\\E")
- 使用适当的Pattern实例与
Pattern.LITERAL
标志 - 或简单地使用
split(Pattern.quote("."))
,让正则expression式为你逃跑。
由于DOT(。)被认为是一个特殊字符,String的分割方法需要一个正则expression式,所以你需要这样做 –
String[] fn = filename.split("\\."); return fn[0];
在java中,特殊字符需要用“\”来转义,但是由于“\”在Java中也是一个特殊字符,所以需要用另一个“\”再次转义它!
通常这不是一个好的主意。 Pattern类中有一个用于这个任务的方法:
java.util.regex static String quote(String s)
分裂必须采取正则expression式作为一个论点…只需改变"."
到"\\."
这不是更有效率的使用
filename.substring(0, filename.indexOf("."))
如果你只想要怎么了第一个点?
split
需要一个正则expression式作为参数。 所以你应该通过“。” 代替 ”。” 因为“。” 是正则expression式中的元字符。