在Java中,删除字符串中多个字符的最佳方法是什么?

5
我有一个字符串,例如foo..txt,我想把它转换成foo.txt。点号的出现可能超过2个。最好的方法是什么?
编辑:点号可能不会连在一起。出现的情况可能如下所示:
foo.bar.txt = foo bar.txt foo..bar.foo.txt = foo bar.txt
6个回答

12

使用replaceAll()函数!像这样:

string = string.replaceAll("\\.{2,}", ".")

请注意,我们不得不转义句点,因为它是正则表达式中的特殊字符(并且为了Java的缘故也要转义反斜杠)。还请注意{2,},它的意思是“如果它出现两次或更多次,则匹配它”。


有时候它可能不是单词,而是单词.单词.单词,需要转换为单词 空格 单词. - Vaishak Suresh

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),后缀(文件扩展名)部分
- 然后我们在前缀部分上使用正则表达式,用\.+替换匹配项为" " - 即一个字面点\.,重复一次或多次+ - 我们还会trim()这个字符串以去除前导和尾随空格
- 我们想要的结果是转换后的前缀与原始后缀连接起来
澄清:
- 模式为\.+而不是.+的原因是点.是一个正则表达式元字符,但在这种情况下,我们真正意思是字面期间,所以它需要转义为\. - 此模式作为Java字符串文字的原因是\本身是Java字符串文字转义字符。例如,字符串文字"\t"包含制表符。类似地,字符串文字"\\"包含反斜杠字符; 它的length()为1。
参考资料:
- 正则表达式信息/点匹配(几乎)任何字符使用Star和Plus进行重复 - String APIlastIndexOftrim() - JLS 3.10.6字符和字符串文字的转义序列

整体回答都很好,尤其是包括测试/演示列表。 - David Lord

4

您让我阅读了手册 :) 我解决了一个更普遍的问题:如何将任何连续出现两个或多个相同字符的情况替换为仅出现一次相同字符:

String str = "assddffffadfdd..o";
System.out.println (str.replaceAll("(.)\\1+", "$1"));

输出:

asdfadfd.o

如果您只需要处理文件名为“filename....ext”的情况,那么我更喜欢像Etaoin的答案那样简单的解决方案,因为它可能会更快(但不是事实)。对于这种具体情况,我的解决方案如下所示:
str.replaceAll("(\\.)\\1+", "$1")

0

使用replaceAll()方法,像这样:

string = string.replaceAll("\\.+(?=.*\\..*)", " ")

将正则表达式从左到右进行改写:

  • "\\.+" 查找一个或多个句点
  • "(?=.*\\..*)" 在向前查找并找到句点后

它可以处理您提到的测试用例 - 但是,像这样的情况:

  • txt.
  • test..txt
  • .test.txt

被转换为以下内容:

  • txt。
  • test .txt
  • test.txt

0
"file....txt".replaceAll("\\.\\.+",".")

正则表达式匹配所有出现超过一个点的情况,并将其替换为单个点。


-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接