I would like to capture $- (or £-)prices >= 20, without cents (pence), where the $ (£) may be in front of or after the value and the currency-symbol may be separated from the value by space(s) or not, e.g.:
$20
$3000
£ 60.67 (but only the '60'-part)
33$
500.99$ (but only the '500'-part)
90 £
Something like:
(?:[^\d][$£] ?)([\d]{3,}|[2-9][\d]{1})|([\d]{3,}|[2-9][\d]{1})(?: *.?[0-9]* ?[$£])
...which works, but simpler (or at least without the non-capturing (?: )
-syntax because it doesn't work with my regex browser highlight extension.
I would like to use this to highlight prices e.g. on Amazon via a regex browser extension. If you happen to know a good one (which possibly even supports (?: )
-syntax) I'd be happy to hear your suggestions, too :-)
Many thanks in advance
CodePudding user response:
You can use the following regex:
(?<=[$£])\s*([2-9]\d|\d{3,})(?=[\.\s])|(?<!\.)([2-9]\d|\d{3,})(?=(?:\.\d )?\s*[$£])
which splits the matching in two cases:
- case 1: your money symbol is found before the numeric value
- case 2: your money symbol is found after the numeric value
"Case 1": (?<=[$£])\s*([2-9]\d|\d{3,})(?=[\.\s])
(?<=[$£])
: the money symbol is followed by...\s*
: spaces([2-9]\d|\d{3,})
: 20 or bigger numeric values(?=[\.\s])
: followed by either a dot (if decimal) or a space
"Case 2": (?<!\.)([2-9]\d|\d{3,})(?=(?:\.\d )?\s*[$£])
(?<!\.)
: match is not preceeded by a dot([2-9]\d|\d{3,})
: 20 or bigger numeric values(?=(?:\.\d )?\s*[$£])
: followed by optional dot and numbers (for decimal), mandatory spaces and the money symbol
Check the demo here.