Regex101 vs Oracle Regex -


my regex:

^\+?(-?)0*([[:digit:]]+,[[:digit:]]+?)0*$ 

it removing leading + , leading , tailing 0s in decimal number.

i have tested in regex101

for input: +000099,8420000 , substitution \1\2 returns 99,842

i want same result in oracle database 11g:

select regexp_replace('+000099,8420000','^\+?(-?)0*([[:digit:]]+,[[:digit:]]+?)0*$','\1\2') dual; 

but returns 99,8420000 (tailing 0s still present...)

what i'm missing?

edit

it works greedy quantifier * @ end of regex, not lazy *? set lazy one.

the problem well-known worked henry spencer's regex library implementations: lazy quantifiers should not mixed greedy quantifiers in 1 , same branch since leads undefined behavior. tre regex engine used in r shows same behavior. while may mix lazy , greedy quantifiers extent, must make sure consistent result.

the solution use lazy quantifiers inside capturing group:

select regexp_replace('+000099,8420000', '^\+?(-?)0*([0-9]+?,[0-9]+?)0*$','\1\2') result dual 

see online demo

the [0-9]+?,[0-9]+? part matches 1 or more digits few times possible followed comma , 1 or more digits, few possible.

some more tests (select regexp_replace('+00009,010020','[0-9]+,[0-9]+?([1-9])','\1') dual yields +20) prove the first quantifier in group sets quantifier greediness type. in case above, group 0 quantifier greediness set greedy first ? quantifier, , group 1 (i.e. ([0-9]+?,[0-9]+?)) greediness type set first +? (which lazy).

enter image description here


Comments

Popular posts from this blog

networking - Vagrant-provisioned VirtualBox VM is not reachable from Ubuntu host -

c# - ASP.NET Core - There is already an object named 'AspNetRoles' in the database -

ruby on rails - ArgumentError: Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true -