【问题标题】:Making range of characters not greedy in Regex在正则表达式中使字符范围不贪婪
【发布时间】:2014-08-06 11:28:29
【问题描述】:

我有一个消息列表,我在该消息中搜索 4 位或 3 位数字号码,然后将其替换为该号码。

所以我现在的正则表达式是

查找

(.*)([0-9]{3,4})(.*)\r

替换

\2

但是,问题在于 [0-9]{3,4} 如果有 4 位数字,则只取前 3 位数字,因此即使有 4 位数字序列,它也只会抓取 3 位数字.这是我不想要的。

如果可以的话,有没有办法让它抓取一个 4 位数字,如果在该行中找不到 4 位数字,则只能抓取一个 3 位数字。

谢谢

【问题讨论】:

    标签: regex non-greedy


    【解决方案1】:

    正则表达式使用*? 运算符支持非贪婪:

    (.*?)([0-9]{3,4})(.*)\r
    

    根据您用于匹配正则表达式的程序,您将需要添加额外的标志。

    在这种情况下,正则表达式更乐意将数字分配给第二组而不是第一组。默认情况下,正则表达式是从左到右贪婪的:它们会尝试将所有内容存储在第一组中,并且仅在必要时才移动到下一个(以仍然匹配字符串)。

    【讨论】:

    • 感谢它的工作。我没有意识到你让周围的一切都变得不贪婪。
    • @CasimiretHippolyte:谢谢,修改了,尽管语义上这并没有改变任何东西:它已经是最后一组,因此默认情况下它已经是不那么贪婪的一组。
    • 语义上是的,但如果正则表达式引擎不够聪明,无法自动优化(在这种情况下会变得贪婪)类似.*?\r (\r 并不总是换行序列的一部分)
    【解决方案2】:

    试试这个:

    (([0-9]{4})|([0-9]{3}))
    

    需要 4 位数字,如果不能,则需要 3 位数字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 1970-01-01
      • 1970-01-01
      • 2012-03-30
      • 1970-01-01
      相关资源
      最近更新 更多