【问题标题】:Regex How to make groups greedy [duplicate]正则表达式如何使组贪婪[重复]
【发布时间】:2014-09-18 09:39:13
【问题描述】:

我想构建一个允许我传入模式的标记器。

据我了解,在普通 OR 组中,第一场比赛获胜。

这种模式:

(?<integer>[0-9]+)|(?<float>[0-9]+[.][0-9]+)|(?<invalid>[^\s]+)

永远不会匹配float 组,因为integer 组总是首先匹配。 我想要的行为是前两组尽可能贪婪地匹配,最后一组尽可能不贪婪地匹配。

2.2BLA3.1 应该匹配为float(2.2), invalid(BLA), float(3.1)

我的用例不允许我给标记一个固定的顺序,所以我必须通过向正则表达式添加额外的控制字符来解决这个问题。

需要补充什么?


编辑:

到目前为止,已经有很好的建议,在此先感谢。 一个建议是更改排序。不幸的是,我的用例不允许我给令牌一个固定的顺序。所以我无法预测我获得组信息的顺序。

另一个非常有趣的事情是使integer 组更具限制性。这也不适合用例。我之前没有提到这一点,但基本上我得到了一个元组列表tokennametokenpattern,我必须将它们放入一个大模式中。

(?<integer>[0-9]+)|(?<float>[0-9]+[.][0-9]+)|(?<invalid>[^\s]+)

这种模式可能是修改列表的结果,例如

{
    {"integer","[0-9]+"},
    {"float","[0-9]+[.][0-9]+"}
}

当我问需要添加什么时,我希望使用一些控制序列来改变组本身的行为。

【问题讨论】:

标签: regex


【解决方案1】:
(?<integer>(?:[0-9](?!\d*\.))+)|(?<float>[0-9]+[.][0-9]+)|(?<invalid>[^\s]+)

你可以试试这个。查看演示。

http://regex101.com/r/bZ8aY1/2

【讨论】:

    【解决方案2】:

    如果您将(?![.]) 附加到整数的定义(即仅当当前位置之后没有点时才匹配的零宽度前瞻),它应该可以工作。否则,您可以尝试切换&lt;float&gt;&lt;integer&gt;

    【讨论】:

      【解决方案3】:

      整数看起来与浮点数相同,但具有更严格的正则表达式,因此在整数之前查找浮点数应该是安全的。这样,如果它完全可以匹配一个浮点数,那么它会匹配,如果它不能,那么它只会寻找一个常规整数:

      (?<float>[0-9]+[.][0-9]+)|(?<integer>[0-9]+)|(?<invalid>[^\s]+)
      

      然后,为了使最后一组(无效)尽可能不贪婪,您可以使用 +? 修饰符(尽管值得注意的是,这一次将一个字符匹配到 invalid 匹配结果中):

      (?<float>[0-9]+[.][0-9]+)|(?<integer>[0-9]+)|(?<invalid>[^\s]+?)
      

      还值得一提的是,.75 在技术上是一个有效的浮点值 - 您可能需要更新它,以便浮点值的整数部分是可选的:

      (?<float>[0-9]*[.][0-9]+)|(?<integer>[0-9]+)|(?<invalid>[^\s]+?)
      

      【讨论】:

      • 是的,但是我的用例不允许我给令牌一个固定的顺序。所以我无法控制integer 是否在float 之前结束。
      • 我不确定我是否关注你。它们在匹配的数据中出现的顺序无关紧要,只需尝试在整数之前匹配浮点数即可解决问题。所有浮点数都以整数值开头,但并非所有整数都以浮点值开头
      • 这些部分被传递到创建组合的函数中。我所能做的就是按长度对它们进行排序,但那是猜测。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-11
      相关资源
      最近更新 更多