我使用以下模式匹配字符串中的数字。我知道在我尝试匹配的字符串中只有一个数字。
var str = "Store # 100";
var regex = new Regex(@"[0-9]*");
当我调用regex.Match.Value
时,会返回一个空字符串。但是,如果我将其更改为:
var regex = new Regex(@"[0-9]*$");
它确实返回了我想要的值。是什么给了什么?
答案 0 :(得分:1)
好的我明白了。
问题[0-9]*
或让问题更简单:\d*
*
使其可选,因此它也会导致零' 100'之前每个字符的长度匹配。
要解决此问题,您可以使用\d\d*
,这将在其余部分之前至少产生一个强制数字,并清除零长度匹配。
编辑:美元版本,例如只有当您的号码位于输入字符串的末尾时,\d*$
才会起作用。
Aaaaand One more link for yet even more info(什么时候活着)。
答案 1 :(得分:1)
根据MSDN,
量词*,+和{n,m}及其懒惰的对应物永远不会 在最小捕获次数有空匹配后重复 被发现了。此规则可防止量词进入无限 空子表达式上的循环匹配时的最大数量 可能的群体捕获是无限的或接近无限的。
因此,当最小捕获数为零时,[0-9]*
模式返回如此多的NULL。并且[0-9]+
会毫无问题地捕获100
。