Java 将逗号的最后一个实例替换为';和';一串
我有一串逗号分隔的单词,例如Java 将逗号的最后一个实例替换为';和';一串,java,java-8,Java,Java 8,我有一串逗号分隔的单词,例如“a,b,c” 我需要将最后一个逗号实例替换为“and”,使其看起来像“a、b和c” 我尝试过使用replaceFirst,如下所示: "a, b, c".replaceFirst("(,)[^,]+$", " and") 但它不起作用。它将最后一个逗号后的所有内容替换为“and”,而不仅仅是产生“a、b和“”的逗号 如何使其工作? 我在java8上 另外,我认为这是显而易见的,但似乎我需要澄清,我正在寻找一种通用的解决方案,可以使用任意数量的逗号分隔的标记,即“a
“a,b,c”
我需要将最后一个逗号实例替换为“and”,使其看起来像
“a、b和c”
我尝试过使用replaceFirst,如下所示:
"a, b, c".replaceFirst("(,)[^,]+$", " and")
但它不起作用。它将最后一个逗号后的所有内容替换为“and”,而不仅仅是产生“a、b和“
”的逗号
如何使其工作?我在java8上
另外,我认为这是显而易见的,但似乎我需要澄清,我正在寻找一种通用的解决方案,可以使用任意数量的逗号分隔的标记,即“a,b,…,c”我认为您不需要Java 8中的任何特殊内容。如果您想使用ReGeX路由,则可以考虑使用以下模式:
(.*), (.*)
使用第一个和第二个捕获组简单地重建字符串,在它们之间有和
。第一个模式(.*)
将贪婪地消耗所有东西,直到最后一个逗号,这正是您想要的行为。然后,第二个(.*)
执行清理以捕获最后一个字母/字符串
String input = "a, b, c";
input = input.replaceAll("(.*), (.*)", "$1 and $2");
System.out.println(input);
输出:
a, b and c
您还可以使用
lastIndexOf
实现相同的功能:
String str = "a, b, c";
StringBuilder builder = new StringBuilder(str);
int lastindex = str.lastIndexOf(",");
builder.replace(lastindex, lastindex + 1, " and" );
System.out.println(builder.toString());
输出:
a, b and c
我认为
replaceFirst
比replaceAll
更适合您,因为您只想替换一次而不是全部,而且它比replaceAll
运行得更快
${number}
捕获组
"a, b, c".replaceFirst(",([^,]+)$", " and$1"); // return "a, b and c"
"a, b, c".replaceFirst(",(?=[^,]+$)", " and"); // return "a, b and c"
字符串的'lastIndexOf'会有帮助,我也在考虑lastIndexOf,但它不能用在替换上,对吗?使用
“a,b,c”。replaceFirst(,([^,]+)$,“和$1”)
@Holger哈哈,我们是一样的。@holi java:我已经注意到了。imho,这是解决问题的最直接的方法。你可以加上为什么它有效:第一个*
是贪婪的,所以除了最后一个,
,它会消耗掉所有的东西。(好吧,他们都很贪婪,但较早的一个首先变得贪婪。)我没有否决投票,但replaceFirst
有点误导;这实际上是一个单一的更换那里。。。可能用replaceAll
替换会更有意义。@尤金我认为replaceFirst
比replaceAll
更有意义,因为OP想替换一次。谢谢,我想知道为什么投票否决它。@Holger我不在乎投票,我想知道为什么投票否决它?“你们能告诉我为什么吗?”霍尔格我已经把它从回答中删除了,你们可能误解了我。我只是想知道为什么?有时,轻量级的StringBuilder
操作可能比正则表达式操作更可取,但是,使用部分复制而不是复制整个字符串并移动内容会更有效:int lastindex=str.lastIndexOf(',');字符串结果=新建StringBuilder(str.length()+3).append(str,0,lastindex).append(“and”).append(str,lastindex+1,str.length()).toString()代码>