在java中删除字符串中多个字符出现的最佳方法是什么

时间:2010-05-13 09:25:33

标签: java regex string

我有一个像foo..txt的字符串,我想将它转换为foo.txt '。'的出现也可能超过2个。 实现这一目标的最佳方法是什么?

编辑:'。'可能不会一起发生。出现的情况也可能如下所示

foo.bar.txt = foo bar.txt
foo..bar.foo.txt = foo bar.txt

6 个答案:

答案 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字符串文字的原因是\.,因为"\\.+"本身就是一个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("\\.+(?=.*\\..*)", " ")

从左到右解释正则表达式:

  • "\\.+"寻找一个或多个时期
  • 展望未来并找到一段时间之后
  • "(?=.*\\..*)"

它处理您提到的测试用例 - 但是,例如:

  • TXT。
  • test..txt
  • .test.txt

按如下方式转换:

  • TXT。
  • test .txt
  • 的test.txt

答案 5 :(得分:-1)

我建议String.replaceAll