【问题标题】:Why is this non-greedy regex grabbing more than I want?为什么这个非贪婪的正则表达式比我想要的更多?
【发布时间】:2013-04-29 18:27:25
【问题描述】:

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

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

为什么它会这样工作,我如何让它返回“州,国家”。我想要这个答案作为正则表达式。

【问题讨论】:

    标签: java regex non-greedy


    【解决方案1】:
    1. 如果你想让.* 不贪婪,你需要在* 之后添加?
    2. replaceAll 将替换所有匹配的部分,所以你应该使用replaceFirst

    试试

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

    输出:

    state,country
    

    如果您不能使用replaceFirst 并且需要继续使用replaceAll,那么@Reimeus answer 可能就是您要找的。​​p>

    【讨论】:

    • 如果只使用replaceFirst,这将起作用,否则将消灭城市和州。
    • @0A0D 我不确定你想说什么。你能解释一下吗?
    • 它会匹配 city,state, 然后什么都没有替换它,然后给他country.. 我认为:regexr.com?34nck 如果你使用 replaceAll
    • 是的,如果您使用 replaceFirst :) .. 其他回答者正在使用 replaceAll
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • +1 - 很好地使用否定字符类来替代不情愿的限定符。
      • 同意@Alex,这是您回答的一个很好的方面。你可以走得更远,让它成为一个“占有”的贪婪匹配,即^[^,]*+,,这表明永远不需要回溯。
      【解决方案4】:

      试试这个表达式:

      ^(.*?,)
      

      或类似:

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

      【讨论】:

      • 不知道为什么你被否决了。我确实从这个答案中了解到,替换方面接受了组引用,+1 来自我。
      【解决方案5】:

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

      你想要的

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

      【讨论】:

      • 这将消灭城市,州..他想保留州,国家
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-12
      • 2013-02-15
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多