模式中的贪婪

时间:2014-06-16 16:10:33

标签: .net regex

假设

string x = 100 4f fdsa fdsa few 2 dsa 12 3 +200 -100
pattern = (?<A>\d+).*?(?<B>(\+|-)?\d+(\.\d)?)?\s*(?<C>(\+|-)\d+(\.\d)?)

预期的行为是A = 100 B = + 200和C = -100 正则表达式的结果是A = 100 C = + 200

我不确定为什么会这样? B上的量词应该以贪婪的方式表现,并且。*?应该不贪心。

有没有更好的方法来编写这个模式,因为我似乎经常遇到这种情况,在一个字符串上执行匹配,在所需的令牌中间有很多无用的数据?

所以只是总结所有这些可能的字符串

1 +1 A=1 B=null C=+1
1 6 +1 A=1 B=6 C=+1
1 7 6 +1 A=1 B=6 C=+1
1 asd asfd 1 7 +6.0 -7 A=1 B=+6.0 C=-7

1 个答案:

答案 0 :(得分:1)

这听起来像你在寻找:

^(?<A>\d+).*?(?<B>[+-]?\d+(\.\d)?)?\D*(?<C>[+-]\d+(\.\d)?)$

请参阅demo两行,以及右下方窗格中的组。

原作有什么问题?

问题在于,您的懒惰.*?只与所需的匹配 - 在某些数字之前(带有可选符号)与非可选符号匹配。早在3 +200时就满意了:3成为B组,+ 200成为C组。

要强制将C组作为最后签名的数字,您还可以在原始正则表达式的末尾添加字符串结束$(请参阅demo):

(?<A>\d+).*?(?<B>(\+|-)?\d+(\.\d)?)?\s*(?<C>(\+|-)\d+(\.\d)?)$
相关问题