Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么正则表达式组提取给出了错误的答案?_C#_Regex - Fatal编程技术网

C# 为什么正则表达式组提取给出了错误的答案?

C# 为什么正则表达式组提取给出了错误的答案?,c#,regex,C#,Regex,我试图获取整数的数字(不存在小数), 或小数点前的数字部分 下面的例子应该给出12345作为答案。但它给出的是1234(吃掉5个) string isDecimalTypeNumber=@“^(?[0-9]*)\.?[0-9]+?$”; 正则表达式模式=新正则表达式(IsDecimalTypeNumber); 匹配=模式匹配(“12345”); 如果(匹配成功) { 字符串wholeNumberPartWithoutPlusMinusSign=match.Groups[“wholeNumberP

我试图获取整数的数字(不存在小数), 或小数点前的数字部分

下面的例子应该给出12345作为答案。但它给出的是1234(吃掉5个)

string isDecimalTypeNumber=@“^(?[0-9]*)\.?[0-9]+?$”;
正则表达式模式=新正则表达式(IsDecimalTypeNumber);
匹配=模式匹配(“12345”);
如果(匹配成功)
{
字符串wholeNumberPartWithoutPlusMinusSign=match.Groups[“wholeNumberPart”].Value;
MessageBox.Show(wholeNumberPartWithoutPlusMinusSign);
}
捕获小数点(如果存在)

捕获最后一个数字,无论是否有小数点

如您所见,最后一位捕获了5,只剩下1234作为整数部分

我认为这就解释了为什么正则表达式组提取给你1234的错误答案

捕获小数点(如果存在)

捕获最后一个数字,无论是否有小数点

如您所见,最后一位捕获了5,只剩下1234作为整数部分

我认为这就解释了为什么正则表达式组提取给你1234的错误答案
  • 十进制分隔符(
    \.?
    )是可选的,因此可能不匹配
  • 小数部分(
    [0-9]+?
    )不是可选的,而是惰性的,因此它仍将尝试匹配
  • 因此,可能发生的情况是1234被整数部分消耗,而
    \。?
    不匹配,但5被小数部分消耗

    应将小数分隔符和小数部分合并为一个可选组:

    @"^(?<wholeNumberPart>[0-9]*)(\.[0-9]+)?$"
    
    @“^(?[0-9]*)(\[0-9]+)?$”
    
    • 十进制分隔符(
      \.?
      )是可选的,因此可能不匹配
    • 小数部分(
      [0-9]+?
      )不是可选的,而是惰性的,因此它仍将尝试匹配
    因此,可能发生的情况是1234被整数部分消耗,而
    \。?
    不匹配,但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]+)?$"