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

7

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

假设我有以下字符串:

String string = "hello.world.how.are.you!";

我想将最后一个点替换为感叹号,使结果为:
"hello.world.how.are!you!"

我尝试使用String.replaceAll(String, String) 方法进行替换,但是一直没有成功。

4个回答

14

一种方法是:

string = string.replaceAll("^(.*)\\.(.*)$","$1!$2");

你也可以使用负向先行断言:

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

正则表达式实战


非常感谢!我永远想不到那个怪物。 - digiarnie
2
它是一个“怪物”(你的话,不是我的),这可能是不使用它的一个好理由 :-) 不过,如果它能够工作,应该被接受,因为你确实要求了一个正则表达式解决方案。 - paxdiablo
我像贪婪模式一样贪心,我批准 :) 贪婪 .* 的使用很好。 - TWiStErRob
为什么不将第二个量词设为“勉强匹配”,例如 ^(.*)\\.(.*?)$ - Emil Lundberg

10

虽然你可以使用正则表达式,但有时候最好退一步走老路。我一直认为,如果你不能在约两分钟内想出正则表达式来解决它,那么它可能并不适合使用正则表达式。

毫无疑问地,在这里会得到一些精彩的正则表达式答案。其中一些甚至可能是可读的:-)

你可以使用 lastIndexOf 来获取最后一个出现位置,substring 来构建一个新字符串:这个完整的程序展示了如何实现:

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 !

是的,我有一个使用 StringBuilder 并基于最后一个点的索引进行替换的解决方案。但如果可能的话,我想使用正则表达式来完成它,因此提出了这个问题。 - digiarnie
只是提醒一下,我之前使用 StringBuilder 的解决方案如下:StringBuilder builder = new StringBuilder(string); builder.replace(lastDotIndex, lastDotIndex + 1, "!"); String newString = builder.toString(); - digiarnie

7
您需要的正则表达式是\\.(?=[^.]*$)。其中?=是向前断言。
"hello.world.how.are.you!".replace("\\.(?=[^.]*$)", "!")

1

试试这个:

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

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