将逗号的最后一个实例替换为字符串中的"和"

spo*_*boy 8 java java-8

我有一串逗号分隔的单词,例如"a, b, c".
我需要用"和"替换最后一个逗号实例,使它看起来像"a, b and c".

我尝试过像这样使用replaceFirst:

"a, b, c".replaceFirst("(,)[^,]+$", " and")
Run Code Online (Sandbox Code Playgroud)

但它不起作用.它用"和"替换最后一个逗号之后的所有内容,而不仅仅是逗号生成"a, b and".

如何使它工作?
我在java8上.

PS.我认为这很明显,但似乎我需要澄清一下,我正在寻找一个适用于任意数量逗号分隔标记的通用解决方案,即'a,b,....,c'

Tim*_*sen 10

我不认为你在Java 8中需要什么特别的东西.如果你想使用正则表达式路线String#replaceAll(),那么你可以考虑使用以下模式:

(.*), (.*)
Run Code Online (Sandbox Code Playgroud)

使用第一个和第二个捕获组简单地重建字符串,and在它们之间.第一个模式(.*)将贪婪地消耗所有内容,直到最后一个逗号,这正是您想要的行为.然后,第二个进行(.*)清理以捕获最后的字母/字符串.

String input = "a, b, c";
input = input.replaceAll("(.*), (.*)", "$1 and $2");
System.out.println(input);
Run Code Online (Sandbox Code Playgroud)

输出:

a, b and c
Run Code Online (Sandbox Code Playgroud)

  • 你可能会添加它的工作原理:第一个`.*`是贪婪的,所以除了最后一个`,`之外都消耗掉了.(嗯,他们都贪婪,但早先的贪婪首先.) (5认同)

hol*_*ava 7

我认为这replaceFirstreplaceAll你更好,因为你想要只更换一次,而不是全部,而且运行速度比replaceAll.

  1. 使用${number}于捕获组.

    "a, b, c".replaceFirst(",([^,]+)$", " and$1"); // return "a, b and c"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用正向前瞻:

    "a, b, c".replaceFirst(",(?=[^,]+$)", " and"); // return "a, b and c"
    
    Run Code Online (Sandbox Code Playgroud)