十进制/浮点数提取正则表达式可能会有所不同,具体取决于是否使用千位分隔符以及使用的千位分隔符、表示小数分隔符的符号、是否还想匹配指数、是否匹配正号或负号,是否匹配可能省略前导 0 的数字,是否提取以小数分隔符结尾的数字。
Matching Floating Point Numbers with a Regular Expression 中提供了一个通用正则表达式来匹配最常见的十进制数字类型:
[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?
我只是将捕获组更改为非捕获组(在( 之后添加?:)。 It matches
如果您需要使其更加通用,如果小数点分隔符可以是点或逗号,请将 \. 替换为字符类(或括号表达式)[.,] :
[-+]?[0-9]*[.,]?[0-9]+(?:[eE][-+]?[0-9]+)?
^^^^
注意上面的表达式匹配整数和浮点数。 仅匹配浮点数/十进制数通过删除\. 之后的第二个? (demo) 确保小数模式部分是强制性的:
[-+]?[0-9]*\.[0-9]+(?:[eE][-+]?[0-9]+)?
^
现在,34 不匹配: 匹配。
如果您不想匹配不带前导零的浮点数(如 .5),请务必使用第一个数字匹配模式(通过添加 + 量词,以匹配 1 次或多次出现的位数):
[-+]?[0-9]+\.[0-9]+(?:[eE][-+]?[0-9]+)?
^
见this demo。现在,它匹配的样本要少得多:
现在,如果您不想在<digits>.<digits>.<digits>.<digits> 中匹配<digits>.<digits> 怎么办?如何将它们作为整个单词进行匹配?使用lookarounds:
[-+]?(?<!\d\.)\b[0-9]+\.[0-9]+(?:[eE][-+]?[0-9]+)?\b(?!\.\d)
还有一个demo here:
现在,那些有千位分隔符的浮点数呢,比如12 123 456.23 或34,345,767.678?您可以在第一个 [0-9]+ 之后添加 (?:[,\s][0-9]+)* 以匹配零个或多个逗号或空格序列,后跟 1 个以上数字:
[-+]?(?<![0-9]\.)\b[0-9]+(?:[,\s][0-9]+)*\.[0-9]+(?:[eE][-+]?[0-9]+)?\b(?!\.[0-9])
见regex demo:
如果您需要使用逗号作为小数分隔符并使用句点作为千位分隔符,请将逗号与 \. 交换。
现在,如何在 C# 中使用这些模式?
var results = Regex.Matches(input, @"<PATTERN_HERE>")
.Cast<Match>()
.Select(m => m.Value)
.ToList();