我有一个字符串,例如foo..txt,我想把它转换成foo.txt。点号的出现可能超过2个。最好的方法是什么?
编辑:点号可能不会连在一起。出现的情况可能如下所示:
foo.bar.txt = foo bar.txt foo..bar.foo.txt = foo bar.txt
编辑:点号可能不会连在一起。出现的情况可能如下所示:
foo.bar.txt = foo bar.txt foo..bar.foo.txt = foo bar.txt
使用replaceAll()
函数!像这样:
string = string.replaceAll("\\.{2,}", ".")
请注意,我们不得不转义句点,因为它是正则表达式中的特殊字符(并且为了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 + "]");
}
lastIndexOf('.')
- 假设这个索引是k
,那么我们将字符串逻辑分成了:substring(0, k)
,前缀部分
- substring(k)
,后缀(文件扩展名)部分\.+
替换匹配项为" "
- 即一个字面点\.
,重复一次或多次+
- 我们还会trim()
这个字符串以去除前导和尾随空格\.+
而不是.+
的原因是点.
是一个正则表达式元字符,但在这种情况下,我们真正意思是字面期间,所以它需要转义为\.
- 此模式作为Java字符串文字的原因是\
本身是Java字符串文字转义字符。例如,字符串文字"\t"
包含制表符。类似地,字符串文字"\\"
包含反斜杠字符; 它的length()
为1。String API
:lastIndexOf
和trim()
- JLS 3.10.6字符和字符串文字的转义序列
您让我阅读了手册 :) 我解决了一个更普遍的问题:如何将任何连续出现两个或多个相同字符的情况替换为仅出现一次相同字符:
String str = "assddffffadfdd..o";
System.out.println (str.replaceAll("(.)\\1+", "$1"));
输出:
asdfadfd.o
str.replaceAll("(\\.)\\1+", "$1")
使用replaceAll()
方法,像这样:
string = string.replaceAll("\\.+(?=.*\\..*)", " ")
将正则表达式从左到右进行改写:
"\\.+"
查找一个或多个句点 "(?=.*\\..*)"
在向前查找并找到句点后它可以处理您提到的测试用例 - 但是,像这样的情况:
被转换为以下内容:
"file....txt".replaceAll("\\.\\.+",".")
正则表达式匹配所有出现超过一个点的情况,并将其替换为单个点。