Итак, я столкнулся с подобной проблемой: мне нужно было проверить, является ли произвольная строка ценой, но нужно было гораздо больше устойчивости, чем регулярных выражений, представленных в этом и многих других потоках.
Мне нужно регулярное выражение, которое будет соответствовать всем следующим:
- 5
- 5,00
- 1000
- 1,000,000.99
- 5,99 (европейская цена)
- 5,999,99 (европейская цена)
- 0,11
- 0,00
И не сопоставлять такие вещи, как IP-адреса. Я не мог найти ни одного регулярного выражения для работы с европейскими и неевропейскими вещами одним махом, поэтому я написал немного кода Ruby для нормализации цен:
if value =~ /^([1-9][0-9]{,2}(,[0-9]{3})*|[0-9]+)(\.[0-9]{1,9})?$/
Float(value.delete(","))
elsif value =~ /^([1-9][0-9]{,2}(\.[0-9]{3})*|[0-9]+)(,[0-9]{1,9})?$/
Float(value.delete(".").gsub(",", "."))
else
false
end
Единственное различие между двумя регулярными выражениями - это поменялись местами после запятой и запятой. Я попытаюсь объяснить, что это делает:
/^([1-9][0-9]{,2}(,[0-9]{3})*|[0-9]+)(\.[0-9]{1,9})?$/
Первая часть:
([1-9][0-9]{,2}(,[0-9]{3})*
Это заявление о числах, которые следуют за этой формой: 1 000 000 000 100 12. Но это не допускает начальных нулей. Это для правильно отформатированных чисел, которые имеют группы из 3 чисел, разделенных разделителем тысяч.
Вторая часть:
[0-9]+
Просто сопоставьте любое число 1 или более раз. Вы можете сделать это 0 или более раз, если хотите соответствовать: .11 .34 .00 и т. Д.
Последняя часть:
(\.[0-9]{1,9})?
Это бит десятичного разряда. Вы спрашиваете, почему до 9 чисел? Я видел, как это случилось. Предполагается, что это регулярное выражение будет в состоянии справиться с любой странной и замечательной ценой, которую он видит, и я видел, как некоторые розничные продавцы используют до 9 знаков после запятой в ценах. Обычно все 0, но мы не хотели бы пропустить данные ^ _ ^
Надеюсь, это поможет следующему человеку, которому понадобится обработать произвольно неправильно отформатированные строки цен или европейский или неевропейский формат:)