Java 如何使用正则表达式替换字符串中的最后一个点?

Java 如何使用正则表达式替换字符串中的最后一个点?,java,regex,string,Java,Regex,String,我试图用正则表达式替换字符串中的最后一个点 假设我有以下字符串: String string = "hello.world.how.are.you!"; 我想用感叹号替换最后一个点,结果是: "hello.world.how.are!you!" 我已经尝试过使用方法String.replaceAll(String,String)的各种表达式,但运气不好。一种方法是: string = string.replaceAll("^(.*)\\.(.*)$","$1!$2"); 或者,您可以使用负

我试图用正则表达式替换字符串中的最后一个点

假设我有以下字符串:

String string = "hello.world.how.are.you!";
我想用感叹号替换最后一个点,结果是:

"hello.world.how.are!you!"
我已经尝试过使用方法
String.replaceAll(String,String)
的各种表达式,但运气不好。

一种方法是:

string = string.replaceAll("^(.*)\\.(.*)$","$1!$2");
或者,您可以使用负前瞻作为:

string = string.replaceAll("\\.(?!.*\\.)","!");

尽管你可以使用正则表达式,但有时候最好退一步,用老式的方法来做。我一直认为,如果你想不出一个正则表达式能在两分钟内完成,它可能不适合正则表达式的解决方案

毫无疑问,这里有一些很棒的正则表达式。其中一些甚至可以阅读:-)

您可以使用来获取最后一个匹配项并构建新字符串:此完整程序显示了如何:

public class testprog {
    public static String morph (String s) {
        int pos = s.lastIndexOf(".");
        if (pos >= 0)
            return s.substring(0,pos) + "!" + s.substring(pos+1);
        return s;
    }
    public static void main(String args[]) {
        System.out.println (morph("hello.world.how.are.you!"));
        System.out.println (morph("no dots in here"));
        System.out.println (morph(". first"));
        System.out.println (morph("last ."));
    }
}
输出为:

hello.world.how.are!you!
no dots in here
! first
last !

您需要的正则表达式是
\\。(?=[^.]*$)
?=
是一个前瞻性断言

"hello.world.how.are.you!".replace("\\.(?=[^.]*$)", "!")
试试这个:

string = string.replaceAll("[.]$", "");

是的,我有一个解决方案,使用StringBuilder并根据最后一个点的索引进行替换。但我想在可能的情况下使用正则表达式来完成它,因此我提出了一个问题。仅供参考,我以前使用StringBuilder的解决方案是这样的:StringBuilder=new StringBuilder(string);替换(lastDotIndex,lastDotIndex+1,“!”;字符串newString=builder.toString();谢谢!我永远不会想到那个怪物。事实上,它是一个怪物(你的话,不是我的话)可能是不使用它的一个很好的理由:-)但是,如果它有效,它应该被接受,因为你确实要求一个正则表达式解决方案。我像模式一样贪婪,我同意:)贪婪的好用法。*为什么不让第二个量词不情愿,如
^(.*)\.(.*)$