Java字符串拆分为带"&引用;(dot)
为什么此代码的第二行抛出Java字符串拆分为带"&引用;(dot),java,regex,string,split,indexoutofboundsexception,Java,Regex,String,Split,Indexoutofboundsexception,为什么此代码的第二行抛出ArrayIndexOutOfBoundsException String filename = "D:/some folder/001.docx"; String extensionRemoved = filename.split(".")[0]; 虽然这样做有效: String driveLetter = filename.split("/")[0]; 我使用Java 7。如果要在文字点上拆分,则需要转义点: 否则,您将在regex上拆分,这意味着“任何字符”。
ArrayIndexOutOfBoundsException
String filename = "D:/some folder/001.docx";
String extensionRemoved = filename.split(".")[0];
虽然这样做有效:
String driveLetter = filename.split("/")[0];
我使用Java 7。如果要在文字点上拆分,则需要转义点: 否则,您将在regex
上拆分,这意味着“任何字符”。请注意,在正则表达式中创建单个反斜杠需要双反斜杠
您将获得一个
ArrayIndexOutOfBoundsException
,因为您的输入字符串只是一个点,即“
”,这是一个边大小写,在按点拆分时生成一个空数组;从结果中删除所有尾随空格,但由于在点上拆分一个点只会留下两个空格,因此在删除尾随空格后,将留下一个空数组
要避免为此边缘情况获取ArrayIndexOutOfBoundsException
,请使用的重载版本,该版本具有第二个参数,即结果数组的大小限制。当limit
为负值时,将禁用从结果数组中删除尾随空格的行为:
".".split("\\.", -1) // returns an array of two blanks, ie ["", ""]
也就是说,当
filename
只是一个点“
时,调用filename.split(“\\”,-1)[0]
将返回一个空白,但调用filename.split(“\\”)[0]
将抛出一个数组索引超出边界异常
这是因为
是正则表达式中的保留字符,表示任何字符。
相反,我们应该使用以下语句:
String extensionRemoved = filename.split("\\.")[0];
我认为你应该避开这个点。尝试:
String filename = "D:/some folder/001.docx";
String extensionRemoved = filename.split("\\.")[0];
否则,点将被解释为正则表达式中的任何字符。点“.”是java正则表达式引擎中的特殊字符,因此必须使用“\\”转义此字符:
final String extensionRemoved = filename.split("\\.")[0];
我希望这有帮助不使用正则表达式字符串吗?在这种情况下,“.”表示任何字符……它是一个双反斜杠,在Java中不是一个特殊字符。这是Java正则表达式引擎中的一个特殊字符。我的回答不太准确,但我同意你的看法。谢谢你的精确;)这是一个值得区分的地方。而且,我刚刚意识到我自己也有点搞砸了;它在Java中是一个特殊的字符,但这不是它在这里引起问题的原因。无论如何。请注意,文件名可以包含多个点。必须使用“.”的最后一个索引,并使用它来查找文件名的子字符串。@saurabheights问题不是关于正确的正则表达式,而是为什么会有一个
ArrayIndexOutOfBoundsException
。也就是说,你错了:你不需要知道最后一个点在哪里;您只需要正确的正则表达式:filename.split(“\\。(?=[^.]*$)”)
。这使用一个向前看来断言匹配点后面的输入中没有点。@emma您可以通过问题下方的“删除”链接自己删除它们
final String extensionRemoved = filename.split("\\.")[0];