正则表达式如何让群体贪婪

时间:2014-09-18 09:39:14

标签: regex

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

据我所知,在正常的OR组中,第一场比赛获胜。

这种模式:

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

永远不会匹配float群组,因为integer群组始终会先匹配。 我想要的行为是前两组匹配尽可能贪婪,最后一组匹配尽可能不合适。

2.2BLA3.1应与float(2.2), invalid(BLA), float(3.1)

匹配

我的usecase不允许我给令牌一个固定的顺序,所以我必须通过在正则表达式中添加额外的控制字符来解决这个问题。

需要添加什么?


编辑:

到目前为止,已经提出了很多建议。 一个建议是更改订购。不幸的是,我的用例不允许我给令牌一个固定的顺序。所以我无法预测我获得群组信息的顺序。

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

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

这种模式可能是重新编写像

这样的列表的结果
{
    {"integer","[0-9]+"},
    {"float","[0-9]+[.][0-9]+"}
}

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

3 个答案:

答案 0 :(得分:2)

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

你可以尝试一下。参见演示。

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

答案 1 :(得分:1)

如果将(?![.])附加到整数的定义(即只有在当前位置之后没有点才匹配的零宽度前瞻),它应该有效。否则,您可以尝试切换<float><integer>

答案 2 :(得分:0)

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

(?<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]+?)