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

时间:2020-02-01 06:18:11

标签: c# regex

我正在尝试获取一个整数的数字(不存在小数), 或小数点前小数部分的数字部分。

下面的示例应给出12345作为答案。但这是1234(吃掉了5)

            string isDecimalTypeNumbers = @"^(?<wholeNumberPart>[0-9]*)\.?[0-9]+?$";
            Regex pattern = new Regex(isDecimalTypeNumbers);
            Match match = pattern.Match("12345");
            if (match.Success)
            {
                string wholeNumberPartWithoutPlusMinusSign = match.Groups["wholeNumberPart"].Value;
                MessageBox.Show(wholeNumberPartWithoutPlusMinusSign);
            }

2 个答案:

答案 0 :(得分:1)

^(?<wholeNumberPart>[0-9]*)

捕获数字的第一部分

\.?

捕获小数点(如果存在)

[0-9]+?$

捕获最后一个数字,而不管是否有小数点

因此,如您所见,最后一位捕获了5位,只剩下1234作为整个numberPart。

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

答案 1 :(得分:1)

  • 小数点分隔符(\.?)是可选的,因此可能不匹配。
  • 小数部分([0-9]+?)不是可选,而是惰性的,因此它仍然会尝试匹配。

因此,可能发生的情况是整数部分消耗了1234,而\.?不匹配,但小数部分消耗了5。

您应该将小数点分隔符和小数部分组成一个可选的组:

@"^(?<wholeNumberPart>[0-9]*)(\.[0-9]+)?$"