我有一个像foo..txt的字符串,我想将它转换为foo.txt '。'的出现也可能超过2个。 实现这一目标的最佳方法是什么?
编辑:'。'可能不会一起发生。出现的情况也可能如下所示
foo.bar.txt = foo bar.txt
foo..bar.foo.txt = foo bar.txt
答案 0 :(得分:12)
replaceAll()
!像这样:
string = string.replaceAll("\\.{2,}", ".")
请注意,我们必须逃避句点,因为它是正则表达式中的特殊字符(并且为了Java而逃避反斜杠)。另请注意{2,}
,表示“匹配,如果它出现两次或更多次”。
答案 1 :(得分:5)
我相信你想要的是用空格替换文件名部分中的所有句点,但保留扩展名,对吗?
如果是这样,这样的事情是合适的:
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)
,后缀(文件扩展名)部分replaceAll
与\.+
的{{1}}次匹配的前缀部分使用正则表达式
" "
,重复一次或多次\.
+
此字符串用于删除前导和尾随空格trim()
而不是\.+
的原因是因为点.+
是正则表达式元字符,但在这种情况下,我们实际上是指一个文字句点,所以它需要被转义为.
\.
,因为"\\.+"
本身就是一个Java字符串文字转义字符。例如,字符串文字\
包含制表符。类似地,字符串文字"\t"
包含反斜杠字符;它有一个"\\"
。答案 2 :(得分:4)
你让我读了manuals :)我解决了更普遍的问题:如何用一个相同的字符一个接一个地替换任何2个以上相同的字符:
String str = "assddffffadfdd..o";
System.out.println (str.replaceAll("(.)\\1+", "$1"));
输出:
asdfadfd.o
如果你只需要一个解决方案“filename .... ext”,那么我更喜欢像Etaoin的回答中更简单的东西,因为它可能更快(但不是事实)。针对这个具体案例简化的解决方案如下:
str.replaceAll("(\\.)\\1+", "$1")
答案 3 :(得分:0)
"file....txt".replaceAll("\\.\\.+",".")
正则表达式匹配所有出现的多个点,并用一个点替换它。
答案 4 :(得分:0)
像这样使用replaceAll()
:
string = string.replaceAll("\\.+(?=.*\\..*)", " ")
从左到右解释正则表达式:
"\\.+"
寻找一个或多个时期"(?=.*\\..*)"
它处理您提到的测试用例 - 但是,例如:
按如下方式转换:
答案 5 :(得分:-1)