Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将逗号的最后一个实例替换为';和';一串_Java_Java 8 - Fatal编程技术网

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()