2

I need to extract just 94.00 from the string below.

Which regex would I use to do so? My current regex of [^$]+$ is returning $99.00 (176)

5 Easy Payments $94.00 $99.00 (176)
0m3r
  • 12,286
  • 15
  • 35
  • 71
Platypus17
  • 83
  • 2
  • 10

2 Answers2

2

It seems like you might want to use this regular expression:

\$[\d.]+

This matches all prices, so depending on your language, juse use the function to get the first occurrence. However, this will also match something ridiculous like $...... as a price.

\$[\d]+\.[\d]+ will only match prices in the form $123.456 with an arbitrary number of digits.

^[^$]+\$[\d]+\.[\d]+ will match everything up to the last digit in the price. This is useless in its current state because it returns 5 Easy Payments $94.00 for your test string.

^[^$]+(\$[\d]+\.[\d]+) will match the same thing as above, but Group #1 of the regular expression will be the price $94.00. If you want to only match the number itself, move the left bracket over so it becomes ^[^$]+\$([\d]+\.[\d]+).

The issue is that this will return no matches if there's a non-price dollar sign somewhere before the first valid price. As long as that's not an issue, then ^[^\$]+\$([\d]+\.[\d]+) will give you 94.00 for Capture Group 1.

hyper-neutrino
  • 5,272
  • 2
  • 29
  • 50
1

You need to use a capturing mechanism if you cannot use any normal programming method to control the amount of matches you get:

/(\$\d+(?:\.\d+)?)[\s\S]*/

This regex finds the first (because any regex engine processes the string from left to right, at least by default) $+1 or more digits+an optional sequence of '.' and 1 or more digits, captures this text into Group 1 (with (\$\d+(?:\.\d+)?)) and then matches and consumes the whole rest of the string with [\s\S]* (any 0 or more chars).

Your value is in Group 1:

enter image description here

Wiktor Stribiżew
  • 607,720
  • 39
  • 448
  • 563