用点作为分隔符拆分字符串

Dea*_*ean 91 java regex string split

我想知道我是否正在.以正确的方式分割字符串?我的代码是:

String[] fn = filename.split(".");
return fn[0];
Run Code Online (Sandbox Code Playgroud)

我只需要字符串的第一部分,这就是我返回第一项的原因.我问,因为我注意到在API中.意味着任何角色,所以现在我被卡住了.

Mar*_*amy 164

split()接受正则表达式,因此您需要转义.为不将其视为正则表达式元字符.这是一个例子:

String[] fn = filename.split("\\."); 
return fn[0];
Run Code Online (Sandbox Code Playgroud)


And*_*anu 16

Split使用正则表达式,其中'.' 是一个特殊的角色意味着什么.如果你真的希望它与''匹配,你需要逃避它.字符:

String[] fn = filename.split("\\.");
Run Code Online (Sandbox Code Playgroud)

(一个'\'在正则表达式中转义'.',另一个转义为转义Java字符串中的第一个)

另外我不建议返回fn [0]因为如果你有一个名为的文件something.blabla.txt,这是一个有效的名字,你将不会返回实际的文件名.相反,我认为如果你使用它会更好:

int idx = filename.lastIndexOf('.');
return filename.subString(0, idx);
Run Code Online (Sandbox Code Playgroud)


Psh*_*emo 15

我在这里只看到解决方案,但没有对问题的完整解释,所以我决定发布这个答案

问题

你需要了解一些事情text.split(delim).split方法:

  1. 接受作为参数的正则表达式(regex),它描述了我们要分割的分隔符,
  2. 如果delim存在于textlike in a,b,c,,(where delimiter is ,)的末尾,split则会创建类似的数组,["a" "b" "c" "" ""]但由于在大多数情况下我们并不真正需要这些尾随的空字符串,因此它也会自动删除它们.所以它创建了另一个没有这些尾随空字符串的数组并返回它.

你还需要知道.特殊字符正则表达式.它表示任何字符(行分隔符除外,但可以使用Pattern.DOTALL标志更改).

所以对于字符串,"abc"如果我们拆分"." split方法将

  1. 创建数组,如["" "" "" ""],
  2. 但是因为这个数组只包含空字符串而且它们都是尾随的,所以它们将被删除(如前面第二点所示)

这意味着我们将得到结果为空数组[](没有元素,甚至没有空字符串),所以我们不能使用fn[0]因为没有索引0.

要解决这个问题,您只需要创建代表点的正则表达式.要做到这一点,我们需要逃避这一点..有几种方法可以做到这一点,但最简单的方法可能就是使用\(在String中需要编写"\\"因为\在那里也是特殊的,需要另一个\进行转义).

所以你的问题的解决方案可能看起来像

String[] fn = filename.split("\\.");
Run Code Online (Sandbox Code Playgroud)

奖金

您还可以使用其他方式来逃避该点

  • 使用字符类 split("[.]")
  • 将它包装在报价中 split("\\Q.\\E")
  • 使用带有Pattern.LITERAL标志的正确Pattern实例
  • 或者只是使用split(Pattern.quote("."))并让正则表达式为您逃脱.


f1s*_*1sh 14

String#split(String)方法使用正则表达式.在正则表达式中,"." 字符表示"任何字符".您可以通过转义"."来避免此行为.

filename.split("\\.");
Run Code Online (Sandbox Code Playgroud)

或者告诉split方法在字符类中拆分:

filename.split("[.]");
Run Code Online (Sandbox Code Playgroud)

字符类是字符集合.你可以写

filename.split("[-.;ld7]");
Run Code Online (Sandbox Code Playgroud)

和文件名将在每个" - ",".",";","l","d"或"7"分开.里面的字符类,"." 不是特殊字符("元字符").


Nee*_*eel 6

由于DOT(.)被认为是一个特殊字符,而String的split方法需要一个正则表达式,你需要这样做 -

String[] fn = filename.split("\\.");
return fn[0];
Run Code Online (Sandbox Code Playgroud)

在java中,需要使用"\"转义特殊字符,但由于"\"也是Java中的特殊字符,因此需要使用另一个"\"再次转义它!


小智 5

String str="1.2.3";
String[] cats = str.split(Pattern.quote("."));
Run Code Online (Sandbox Code Playgroud)