I have this pattern:
(\w+)(sin|in|pak|red)$
And the replacement pattern is this:
$1tak
The problem is that this word:
setesin
will be transformed to:
setestak
instead of
setetak
For some reason, in
always takes precedence to sin
in the pattern.
How can I enforce the pattern to follow that order?
The order of the characters inside a character class does not matter. The results are identical. You can use a hyphen inside a character class to specify a range of characters. [0-9] matches a single digit between 0 and 9.
'Greedy' means match longest possible string. 'Lazy' means match shortest possible string.
Lazy: As Few As Possible (shortest match) Since the * quantifier allows the engine to match zero or more characters, \w*? E tells the engine to match zero or more word characters, but as few as needed—which might be none at all—then to match an E.
By default quantifiers like * and + are "greedy", meaning that they try to match as much of the string as possible.
Use a lazy quantifier:
(\w+?)(sin|in|pak|red)$
^
See the regex demo
The \w+
contains a greedy quantifier that: 1) grabs as many chars as it can (and note it can match s
, i
, all letters, digits and underscores) and then backtracks (yielding one char after another moving from right to left), trying to accommodate for the subsequent patterns. Since the in
is found first, it is matched, and the whole group is considered matched, the regex goes on to check the end of string with $
. A lazy quantifier will have the regex engine skip the \w+?
after matching 1 word char, and other patterns will be tried, moving from left to right.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With