【发布时间】:2013-04-29 18:27:25
【问题描述】:
我认为这应该返回“州,国家”,但它正在返回“国家”
System.out.println("city,state,country".replaceAll("(.*,)?", ""));
为什么它会这样工作,我如何让它返回“州,国家”。我想要这个答案作为正则表达式。
【问题讨论】:
标签: java regex non-greedy
我认为这应该返回“州,国家”,但它正在返回“国家”
System.out.println("city,state,country".replaceAll("(.*,)?", ""));
为什么它会这样工作,我如何让它返回“州,国家”。我想要这个答案作为正则表达式。
【问题讨论】:
标签: java regex non-greedy
.* 不贪婪,你需要在* 之后添加?。replaceAll 将替换所有匹配的部分,所以你应该使用replaceFirst 试试
System.out.println("city,state,country".replaceFirst(".*?,", ""));
输出:
state,country
如果您不能使用replaceFirst 并且需要继续使用replaceAll,那么@Reimeus answer 可能就是您要找的。p>
【讨论】:
city,state, 然后什么都没有替换它,然后给他country.. 我认为:regexr.com?34nck 如果你使用 replaceAll
顾名思义,replaceAll 替换所有匹配的组。您需要更具体地匹配组的位置。要指定第一个匹配组,您可以指定 String ^ 的开头作为锚点:
"city,state,country".replaceAll("^(.*?,)", "")
【讨论】:
您正在捕获任何以逗号结尾的组,而不仅仅是一个,这就是它目前不起作用的原因。
System.out.println("city,state,country".replaceAll("^[^,]*+,", ""));
【讨论】:
^[^,]*+,,这表明永远不需要回溯。
试试这个表达式:
^(.*?,)
或类似:
System.out.println("city,state,country".replaceAll("(.*?,)((?:.*?,)+)", "$2"));
【讨论】:
那个?非贪婪标志只能在 + 或 * 之后使用,在您的上下文中,它是 0 或 1 匹配。
你想要的
System.out.println("city,state,country".replaceAll("(.*?,)", ""));
【讨论】: