我有一个像foo..txt的字符串,我想将它转换为foo.txt'.'出现 也可能超过2个.完成此任务的最佳方法是什么?
编辑:'.' 可能不会一起发生.出现的情况也可能如下
foo.bar.txt = foo bar.txt
foo..bar.foo.txt = foo bar.txt
Eta*_*oin 12
随着replaceAll()!像这样:
string = string.replaceAll("\\.{2,}", ".")
Run Code Online (Sandbox Code Playgroud)
请注意,我们必须逃避句点,因为它是正则表达式中的特殊字符(并且为了Java而逃避反斜杠).另请注意{2,},这意味着"匹配,如果它发生两次或更多次".
我相信你想要的是用空格替换文件名部分中的所有句点,但保留扩展名,对吧?
如果是这样,这样的事情是合适的:
String[] tests = {
"foo.bar.txt", // [foo bar.txt]
"foo...bar.foo.txt", // [foo bar foo.txt]
"........", // [.]
"...x...dat", // [x.dat]
"foo..txt", // [foo.txt]
"mmm....yummy...txt" // [mmm yummy.txt]
};
for (String test : tests) {
int k = test.lastIndexOf('.');
String s = test.substring(0, k).replaceAll("\\.+", " ").trim()
+ test.substring(k);
System.out.println("[" + s + "]");
}
Run Code Online (Sandbox Code Playgroud)
基本上它的工作方式是:
lastIndexOf('.')在我们的字符串中
找到k,然后我们逻辑上将我们的字符串分成:
substring(0, k),前缀部分substring(k),后缀(文件扩展名)部分replaceAll的匹配\.+与" "
\.,重复一次或多次+trim()此字符串来删除前导和尾随空格\.+不是.+就是因为点.是一个正则表达式元字符,但在这种情况下,我们真正的意思字面期,所以它需要被转义为\."\\.+"是因为\它本身就是一个Java字符串文字转义字符.例如,字符串文字"\t"包含制表符.类似地,字符串文字"\\"包含反斜杠字符; 它有length()一个.String API:lastIndexOf和trim()