【问题标题】:replace last dot in a string with a dollar sign用美元符号替换字符串中的最后一个点
【发布时间】:2021-06-01 00:36:51
【问题描述】:

我想用美元符号替换以下字符串中的最后一个点,我该怎么做?

de.java_chess.javaChess.game.GameImpl.GameStatus

我想改用de.java_chess.javaChess.game.GameImpl$GameStatus

我正在使用以下代码行:

invokedMeth = invokedMeth.replaceAll("(.*)\\.(\\d+)$","$1$$2");

但是,这不起作用,我最终得到了与输入相同的原始字符串。我该如何解决这个问题?

【问题讨论】:

  • 正则表达式中的 \\d+ 匹配一个数字,但您的字符串中没有。替代中间的美元很可能已经逃脱了。最后一件事是 replaceAll 不仅替换了最后一个点,还替换了字符串中的每个点。

标签: java regex replace


【解决方案1】:

对于这个要求,我会使用一个非正则表达式的解决方案,它更容易理解,也更高效。

StringBuilder invokedMethSb = new StringBuilder(invokedMeth);
invokedMethSb.setCharAt(invokedMethSb.lastIndexOf("."), '$');

invokedMeth = invokedMethSb.toString();  
/*de.java_chess.javaChess.game.GameImpl$GameStatus*/

StringBuilder 为这些操作提供了一些很好的工具,例如setCharAt


作为个人意见,我更喜欢以下一种:

char[] invokedArray = invokedMeth.toCharArray();
invokedArray[invokedMeth.lastIndexOf(".")]='$';

invokedMeth = new String(invokedArray);
/*de.java_chess.javaChess.game.GameImpl$GameStatus*/

正则表达式解决方案:

您可以使用Positive Lookahead(?=([^.]*)$),其中([^.]*) 匹配任意数量的非点(即[^.])字符,$ 断言位于行尾的位置。更多解释可以查看regex101.com

public class Main {
    public static void main(String[] args) {
        String str = "de.java_chess.javaChess.game.GameImpl.GameStatus";
        str = str.replaceAll("\\.(?=([^.]*)$)", "\\$");
        System.out.println(str);
    }
}

输出:

de.java_chess.javaChess.game.GameImpl$GameStatus

【讨论】:

    【解决方案2】:

    适当的正则表达式也可以帮助进行这种替换:

    String withDot = "de.java_chess.javaChess.game.GameImpl.GameStatus";
     
    String with$ = withDot.replaceFirst("(\\w+(\\.\\w+)*)(\\.(\\w+))", "$1\\$$4");
     
    System.out.println(with$);
    

    输出online demo:

    de.java_chess.javaChess.game.GameImpl$GameStatus
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-18
      • 1970-01-01
      • 2012-09-21
      • 1970-01-01
      • 2018-01-15
      • 2012-08-26
      相关资源
      最近更新 更多