language agnostic - Regex not being greedy enough -
I've got the following regeses that were working perfectly until the new condition was created
^. * [? & Amp;] U (?: RL)? = (? & Lt; url; gt; *) $ Actually, it is used against the URL, to catch everything after u =, or URL =
URL =
Unfortunately, a strange case came out
/ P>
Ideally, I need a URL "", instead, just edit it ""
Although it is not beautiful
^. * [? & Amp;] (? & Lt;! [? & Amp;] U (?: RL)? =. *) U (?: RL)? = (? & Lt; url & gt; *) $
problem
The problem is not that . * is not greedy enough; It is that other . * which appears first also is greedy.
To illustrate this problem, example. Consider the following two samples; They are similar, except for the reluctance of \ 1 in the second rule:
\ 1 greedy, \ 2 greedy \ 1 reluctance, \ 2 greedy ^ ([0 - 5] *) ([5- 9] *) $ ^ ([0-5] *?) ([5-9] *) $ Here we have two capturing groups . \ 1 capture [0-5] * , and \ 2 capture [5-9] * . How these patterns match and capture it is a side-by-side comparison:
\ 1 greedy, \ 2 grasping \ 1 reluctance, \ 2 greedy ^ ([0 -5] *) ([5- 9] *) $ ^ ([0-5] *?) ($ 5-9) *) $ Input group 1 group 2 group 1 group 2 54321098765 543210 98765 543210 98765 007 00 7 00 7 0123456789 012345 6789 01234 5678 95050 050 65050555 555 & lt; Empty & gt; & Lt; Empty & gt; 555 5550555 5550555 & lt; Empty & gt; 5550 555 Note that as greedy as \ 2 , it can only hold that which is \ 1 before Not found before! Thus, if you want to make \ 2 as possible to 5 , you have to relieve \ 1 , therefore 5 is actually to grab from \ 2 .
Attachment
Related Questions
OK
So implementing it in your problem, there are two ways that you can fix it: You can see the first . * can make reluctant, so ():
^. *? [? & Amp;] U (?: RL)? = (? & Lt; url & gt; *) $ Alternatively, you can get rid of the prefix matching completely ():
[? & Amp;] U (?: RL)? = (? & Lt; url & gt; *) $
Comments
Post a Comment