How to make RegEx Ungreedy in Kotlin [duplicate]

Solution 1:

You need to make your regular expression lazy/non-greedy, because by default, "(.*)" will match all of "file path/level1/level2" xxx some="xxx".

Instead you can make your dot-star non-greedy, which will make it match as few characters as possible:

/location="(.*?)"/

Adding a ? on a quantifier (?, * or +) makes it non-greedy.

Note: this is only available in regex engines which implement the Perl 5 extensions (Java, Ruby, Python, etc) but not in "traditional" regex engines (including JavaScript, Awk, sed, grep without -P, etc.).

Solution 2:

location="(.*)" will match from the " after location= until the " after some="xxx unless you make it non-greedy.

So you either need .*? (i.e. make it non-greedy by adding ?) or better replace .* with [^"]*.

  • [^"] Matches any character except for a " <quotation-mark>
  • More generic: [^abc] - Matches any character except for an a, b or c

Solution 3:

How about

.*location="([^"]*)".*

This avoids the unlimited search with .* and will match exactly to the first quote.

Solution 4:

Use non-greedy matching, if your engine supports it. Add the ? inside the capture.

/location="(.*?)"/

Solution 5:

Use of Lazy quantifiers ? with no global flag is the answer.

Eg,

enter image description here

If you had global flag /g then, it would have matched all the lowest length matches as below. enter image description here