为什么这个非贪婪的正则表达式比我想要的更多?

时间:2013-04-29 18:27:26

标签: java regex non-greedy

我认为这应该返回“州,国家”,但它正在返回“国家”

System.out.println("city,state,country".replaceAll("(.*,)?", ""));

为什么它以这种方式工作,如何让它返回“州,国家”。我希望这个答案是一个正则表达式。

5 个答案:

答案 0 :(得分:12)

  1. 如果您想让.*变得非贪婪,您需要在?之后立即添加*
  2. replaceAll会替换所有匹配部分,因此您应该使用replaceFirst
  3. 尝试

    System.out.println("city,state,country".replaceFirst(".*?,", ""));
    

    输出:

    state,country
    

    如果您无法使用replaceFirst而需要与replaceAll保持联系,那么@Reimeus answer可能正是您所寻找的。

答案 1 :(得分:7)

顾名思义,replaceAll取代所有匹配的组。您需要更具体地匹配组的位置。要指定第一个匹配组,您可以将String ^的开头指定为锚:

"city,state,country".replaceAll("^(.*?,)", "")

答案 2 :(得分:4)

您正在捕获以逗号结尾的任何组,而不只是一个,这就是它目前无效的原因。

System.out.println("city,state,country".replaceAll("^[^,]*+,", ""));

答案 3 :(得分:1)

尝试使用此表达式:

^(.*?,)

或者那样:

System.out.println("city,state,country".replaceAll("(.*?,)((?:.*?,)+)", "$2"));

答案 4 :(得分:0)

?非贪婪标志只能在+或*之后使用,在您的上下文中,它是0或1匹配。

你想要

System.out.println("city,state,country".replaceAll("(.*?,)", ""));