Regex中的可选组返回太多匹配

时间:2016-10-15 16:05:34

标签: c# regex

我想只匹配C#Regex类输入中的值(即2.699.230,20)。

我使用"(\\.?[0-9]){2,}\\,[0-9]{2}",它匹配所需的值5.000,002.699.230,201.000.000,00等。{2,}仅匹配{{1}以上的值}}

但是我想要匹配的同一输入上还有其他值。它们总是999,99或更高,但区别在于它没有小数1.000部分。示例:,004.541.087

所以我把正则表达式的最后一部分放在二进制(存在0或1次)选项中(在小数部分周围添加8.997.434

(...)?,但现在匹配数百个数字,包括"(\\.?[0-9]){2,}(\\,[0-9]{2})?"181.01.5.2等。

那么,我如何使小数部分可选,所以它匹配88541.000,00

1 个答案:

答案 0 :(得分:3)

您似乎只想获得其中包含.千位分隔符的数字,并且小数部分中有可选的2位数字。

使用

@"\b\d{1,3}(?:\.\d{3})+(?:,\d{2})?\b"

请参阅regex demo

详细

  • \b - 领先的字边界(可能会被(?<!\d)负面的后观替换,以便在之前只允许数字...)
  • \d{1,3} - 1至3位数字
  • (?:\.\d{3})+ - 一个点或3个数字的一​​个或多个序列(注意:如果您使用+更改*,它将匹配1.000以下的值{1}})
  • (?:,\d{2})? - ,和2位数的可选序列。
  • \b - 尾随字边界(可能会被替换为(?!\d)否定明字形以禁止数字后面的数字)。

C# demo

var re = @"\b\d{1,3}(?:\.\d{3})+(?:,\d{2})?\b"; 
var str = "values 5.000,00, 2.699.230,20, 1.000.000,00, etc.  999,99 including 18, 1.0, 1.5.2, 8854, etc"; 
var res = Regex.Matches(str, re)
    .Cast<Match>()
    .Select(p => p.Value)
    .ToList();
Console.WriteLine(string.Join("\n", res));