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

Vai*_*esh 5 java regex string

我有一个像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,},这意味着"匹配,如果它发生两次或更多次".


pol*_*nts 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 + "]");
    }
Run Code Online (Sandbox Code Playgroud)

基本上它的工作方式是:

  • 首先,lastIndexOf('.')在我们的字符串中 找到
    • 说这个索引是k,然后我们逻辑上将我们的字符串分成:
      • substring(0, k),前缀部分
      • substring(k),后缀(文件扩展名)部分
  • 然后,我们使用正则表达式的前缀部分replaceAll的匹配\.+" "
    • 也就是说,一个文字点\.,重复一次或多次+
    • 我们还使用trim()此字符串来删除前导和尾随空格
  • 我们想要的结果是与原始后缀连接的转换前缀

澄清

  • 之所以模式是\.+不是.+就是因为点.是一个正则表达式元字符,但在这种情况下,我们真正的意思字面期,所以它需要被转义为\.
  • 这种模式作为Java字符串文字的原因"\\.+"是因为\它本身就是一个Java字符串文字转义字符.例如,字符串文字"\t"包含制表符.类似地,字符串文字"\\"包含反斜杠字符; 它有length()一个.

参考