Java 以点作为分隔符拆分字符串
我想知道我是否打算以正确的方式在Java 以点作为分隔符拆分字符串,java,regex,string,split,Java,Regex,String,Split,我想知道我是否打算以正确的方式在上拆分字符串?我的代码是: String[] fn = filename.split("."); return fn[0]; 我只需要字符串的第一部分,这就是我返回第一项的原因。我问这个问题是因为我在API中注意到表示任何字符,所以现在我被卡住了。拆分必须以regex作为参数。。。只需更改”. >代码> \“ > /p> 代码>()/代码>接受正则表达式,因此您需要逃出 .,不要认为它是正则表达式元字符。下面是一个例子: String[] fn = filena
上拆分字符串?我的代码是:
String[] fn = filename.split(".");
return fn[0];
我只需要字符串的第一部分,这就是我返回第一项的原因。我问这个问题是因为我在API中注意到
表示任何字符,所以现在我被卡住了。拆分必须以regex作为参数。。。只需更改<代码>”.<代码> >代码> \“<代码/> > /p> <代码>代码>()/代码>接受正则表达式,因此您需要逃出<代码> .<代码>,不要认为它是正则表达式元字符。下面是一个例子:
String[] fn = filename.split("\\.");
return fn[0];
split
将正则表达式作为参数。因此,您应该传递“\。”
而不是”
,因为“
是正则表达式中的元字符。字符串分割(String)方法使用正则表达式。
在正则表达式中,“.”字符表示“任何字符”。
可以通过转义“”来避免此行为
或者告诉split方法在字符类上拆分:
filename.split("[.]");
字符类是字符的集合。你可以写
filename.split("[-.;ld7]");
文件名将在每一个“-”,“”,“;”,“l”,“d”或“7”处拆分。在字符类中,“.”不是特殊字符(“元字符”)。使用它不是更有效吗
filename.substring(0, filename.indexOf("."))
如果您只想知道第一个点的内容?Split使用正则表达式,其中“.”是一个表示任何内容的特殊字符。如果确实希望它与“.”字符匹配,则需要对其进行转义:
String[] fn = filename.split("\\.");
(一个“\”用于转义正则表达式中的“.”,另一个用于转义Java字符串中的第一个)
我也不建议返回fn[0],因为如果您有一个名为something.blabla.txt
的文件,这是一个有效的名称,那么您将不会返回实际的文件名。相反,我认为最好使用:
int idx = filename.lastIndexOf('.');
return filename.subString(0, idx);
由于点(.)被视为一个特殊字符,String的split方法需要一个正则表达式,您需要这样做-
String[] fn = filename.split("\\.");
return fn[0];
在java中,特殊字符需要用“\”转义,但由于“\”在java中也是一个特殊字符,因此需要用另一个“\”再次转义 通常用手揭开面具不是个好主意。此任务的模式类中有一个方法:
java.util.regex
static String quote(String s)
我在这里只看到解决方案,但没有对问题的完整解释,所以我决定发布这个答案
问题
关于text.split(delim)
,您需要了解一些事情<代码>拆分方法:
delim
存在于文本的末尾,比如a,b,c,
(其中分隔符是,
)split
首先将创建类似[“a”“b”“c”“”]
的数组,但由于在大多数情况下我们并不真正需要这些尾随的空字符串,所以它也会自动为我们删除它们。因此,它创建另一个没有这些尾随空字符串的数组并返回它
Pattern.DOTALL
标志进行更改)
所以对于像“abc”
这样的字符串,如果我们在上拆分“
拆分方法将
创建类似于[“”]
的数组
但由于该数组只包含空字符串,并且它们都是尾随字符串,因此将删除它们(如前第二点所示)
这意味着我们将得到空数组[]
(没有元素,甚至没有空字符串),因此我们不能使用fn[0]
,因为没有索引0
解决方案
要解决这个问题,只需创建表示点的正则表达式。为此,我们需要避开
。有几种方法可以做到这一点,但最简单的方法可能是使用\
(在字符串中需要写成“\\”
,因为\
在那里也很特殊,需要另一个\
进行转义)
因此,您的问题的解决方案可能如下所示
String[] fn = filename.split("\\.");
奖金
你也可以用其他的方法来逃避这个点
- 使用字符类
拆分(“[.]”)
- 将其包装在引号
split(\\Q.\\E”)
- 使用带有
Pattern.LITERAL
标志的适当模式实例
- 或者简单地使用
split(Pattern.quote(“.”)
并让regex为您进行转义
注意:即使在点转义之后,也应进一步注意此代码段
如果filename只是字符串“”,那么fn的长度仍然是0,fn[0]仍然会抛出异常
这是因为,如果模式至少匹配一次,那么split将从数组中丢弃所有尾随的空字符串(也就是点之前的字符串!),留下一个空数组返回。对我有效的解决方案如下
String str="1.2.3";
String[] cats = str.split(Pattern.quote("."));
filename.split(“[.]”)
使用ApacheComons最简单:
File file = ...
FilenameUtils.getBaseName(file.getName());
注意,它还从完整路径中提取一个文件名。问题是标记为Java,而不是Javascript,这是您链接到的。@MisterSmith先生,您可能想看看这里的编程语言。我们说的是java,不是javascript。你说得绝对正确。昨天我很累,因为正在用两种语言编写代码,所以没有注意到Java数据类型。在2010年,我认为答案可能是正确的,但今天的浏览器却以不同的方式运行。在像现在这样的情况下,最简单的解决方案是向split调用传递一个限制参数2:String[]fn=filename.split(“[.]”,2);这我真的很喜欢:split(“[.]”)
File file = ...
FilenameUtils.getBaseName(file.getName());