C# 为什么正则表达式组提取给出了错误的答案?
我试图获取整数的数字(不存在小数), 或小数点前的数字部分 下面的例子应该给出12345作为答案。但它给出的是1234(吃掉5个)C# 为什么正则表达式组提取给出了错误的答案?,c#,regex,C#,Regex,我试图获取整数的数字(不存在小数), 或小数点前的数字部分 下面的例子应该给出12345作为答案。但它给出的是1234(吃掉5个) string isDecimalTypeNumber=@“^(?[0-9]*)\.?[0-9]+?$”; 正则表达式模式=新正则表达式(IsDecimalTypeNumber); 匹配=模式匹配(“12345”); 如果(匹配成功) { 字符串wholeNumberPartWithoutPlusMinusSign=match.Groups[“wholeNumberP
string isDecimalTypeNumber=@“^(?[0-9]*)\.?[0-9]+?$”;
正则表达式模式=新正则表达式(IsDecimalTypeNumber);
匹配=模式匹配(“12345”);
如果(匹配成功)
{
字符串wholeNumberPartWithoutPlusMinusSign=match.Groups[“wholeNumberPart”].Value;
MessageBox.Show(wholeNumberPartWithoutPlusMinusSign);
}
捕获小数点(如果存在)
捕获最后一个数字,无论是否有小数点
如您所见,最后一位捕获了5,只剩下1234作为整数部分
我认为这就解释了为什么正则表达式组提取给你1234的错误答案
捕获小数点(如果存在)
捕获最后一个数字,无论是否有小数点
如您所见,最后一位捕获了5,只剩下1234作为整数部分
我认为这就解释了为什么正则表达式组提取给你1234的错误答案
\.?
)是可选的,因此可能不匹配[0-9]+?
)不是可选的,而是惰性的,因此它仍将尝试匹配\。?
不匹配,但5被小数部分消耗
应将小数分隔符和小数部分合并为一个可选组:
@"^(?<wholeNumberPart>[0-9]*)(\.[0-9]+)?$"
@“^(?[0-9]*)(\[0-9]+)?$”
- 十进制分隔符(
)是可选的,因此可能不匹配\.?
- 小数部分(
)不是可选的,而是惰性的,因此它仍将尝试匹配[0-9]+?
\。?
不匹配,但5被小数部分消耗
应将小数分隔符和小数部分合并为一个可选组:
@"^(?<wholeNumberPart>[0-9]*)(\.[0-9]+)?$"
@“^(?[0-9]*)(\[0-9]+)?$”
这是1234,请自己试试。如果是整数,我需要整数;如果是小数,我需要整数部分。我的错!起初我误解了这个问题。改用^(?[0-9]*)(?:\[0-9]+)?$
。这使得整个“小数部分”是可选的。@AhmedAbdelhameed您是对的。我需要对小数部分进行分组,因为这也是可选的。当我们已经有一个?在整个括号的末尾(?:\[0-9]+)?它被称为a。它给出了1234,请自己尝试。如果是整数,我需要整数;如果是小数,我需要整数部分。我的错!起初我误解了这个问题。改用^(?[0-9]*)(?:\[0-9]+)?$
。这使得整个“小数部分”是可选的。@AhmedAbdelhameed您是对的。我需要对小数部分进行分组,因为这也是可选的。当我们已经有一个?在整个括号的末尾(?:\[0-9]+)?它被称为.thanx shac。但是为什么(?[0-9]*)不应该捕捉最后一个数字5,因为毕竟12345是一个没有小数的整数。如果[0-9]*
匹配12345
,那么就没有剩下的数字可以匹配[0-9]+?
。正如上面所说,+?
是惰性的,但不是可选的,因此[0-9]+?
必须至少匹配一个数字。明白@bacon。你的解释更清楚了。如果值字符串为空,为什么正则表达式给出匹配成功?Thanx shac。但是为什么(?[0-9]*)不应该捕捉最后一个数字5,因为毕竟12345是一个没有小数的整数。如果[0-9]*
匹配12345
,那么就没有剩下的数字可以匹配[0-9]+?
。正如上面所说,+?
是惰性的,但不是可选的,因此[0-9]+?
必须至少匹配一个数字。明白@bacon。你的解释更清楚了。Thanx。如果值字符串为空,为什么正则表达式会给出匹配成功?Thanx Xiaoy。我尝试了这个方法(与@AhmedAbdelhameed推荐的方法相同),效果很好。Thanx.如果值字符串为空,为什么正则表达式会给出匹配成功?只需将[0-9]*
更改为[0-9]+
。*
匹配0到多个元素,因此没有任何内容也是有效匹配。将其替换为+
将使其匹配1对多元素。Thanx Xiaoy。我尝试了这个方法(与@AhmedAbdelhameed推荐的方法相同),效果很好。Thanx.如果值字符串为空,为什么正则表达式会给出匹配成功?只需将[0-9]*
更改为[0-9]+
。*
匹配0到多个元素,因此没有任何内容也是有效匹配。将其替换为+
将使其匹配1对多元素。
\.?
[0-9]+?$
@"^(?<wholeNumberPart>[0-9]*)(\.[0-9]+)?$"