Регулярное выражение для извлечения десятичных чисел или чисел с плавающей запятой может быть различным в зависимости от того, используются ли и какие тысячи разделителей, какой символ обозначает десятичный разделитель, хочет ли он также соответствовать показателю степени, совпадать или нет положительный или отрицательный знак, совпадают ли с числами, которые могут опускаться 0
, независимо от того, извлекается ли число, заканчивающееся десятичным разделителем.
A универсальное регулярное выражение для соответствия наиболее распространенным типам десятичных чисел предоставляется в Сопоставление чисел с плавающей точкой с регулярным выражением :
[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?
Я изменил только группу захвата на группу без захвата (добавлено ?:
после (
). Это соответствует
Если вам нужно сделать его еще более универсальным, , если десятичный разделитель может быть либо точкой, либо запятой , замените \.
на класс символов (или выражение в скобках) [.,]
:
[-+]?[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]+)?
^
См. это демо . Теперь это соответствует гораздо меньшему количеству образцов:
А что если вы не хотите совпадать с <digits>.<digits>
внутри <digits>.<digits>.<digits>.<digits>
? Как сопоставить их как целые слова ? Используйте lookarounds :
[-+]?(?<!\d\.)\b[0-9]+\.[0-9]+(?:[eE][-+]?[0-9]+)?\b(?!\.\d)
И демо здесь :
А как насчет тех чисел с плавающей точкой, которые имеют тысячи разделителей, например 12 123 456.23
или 34,345,767.678
? Вы можете добавить (?:[,\s][0-9]+)*
после первого [0-9]+
, чтобы сопоставить ноль или более последовательностей запятой или пробела, за которыми следуют 1+ цифр:
[-+]?(?<![0-9]\.)\b[0-9]+(?:[,\s][0-9]+)*\.[0-9]+(?:[eE][-+]?[0-9]+)?\b(?!\.[0-9])
См. Демонстрационную версию regex :
Поменяйте запятую на \.
, если вам нужно использовать запятую в качестве десятичного разделителя и точку в качестве разделителя тысяч.
Теперь, как использовать эти шаблоны в C #?
var results = Regex.Matches(input, @"<PATTERN_HERE>")
.Cast<Match>()
.Select(m => m.Value)
.ToList();