Thread overview
Regex-Fu
May 25, 2015
Chris
May 25, 2015
Namespace
May 25, 2015
novice2
May 25, 2015
Chris
May 25, 2015
I'm a bit at a loss here. I cannot get the longest possible match. I tried several versions with eager operators and stuff, but D's regex engine(s) always seem to return the shortest match. Is there something embarrassingly simple I'm missing?

void main()
{
  import std.regex : regex, matchFirst;
  import std.stdio : writeln;

  auto word = "blablahula";
  auto m = matchFirst(word, regex("^([a-z]+)(hula|ula)$"));
  writeln(m);  // prints ["blablahula", "blablah", "ula"]
}

I want it to return "hula" not "ula".
May 25, 2015
On Monday, 25 May 2015 at 11:11:50 UTC, Chris wrote:
> I'm a bit at a loss here. I cannot get the longest possible match. I tried several versions with eager operators and stuff, but D's regex engine(s) always seem to return the shortest match. Is there something embarrassingly simple I'm missing?
>
> void main()
> {
>   import std.regex : regex, matchFirst;
>   import std.stdio : writeln;
>
>   auto word = "blablahula";
>   auto m = matchFirst(word, regex("^([a-z]+)(hula|ula)$"));
>   writeln(m);  // prints ["blablahula", "blablah", "ula"]
> }
>
> I want it to return "hula" not "ula".

Make the + operator less greedy:

matchFirst(word, regex("^([a-z]+?)(hula|ula)$"));
May 25, 2015
> I cannot get the longest possible
it match longest for first group ([a-z]+)

try

^([a-z]+?)(hula|ula)$

May 25, 2015
On Monday, 25 May 2015 at 11:20:46 UTC, novice2 wrote:
>> I cannot get the longest possible
> it match longest for first group ([a-z]+)
>
> try
>
> ^([a-z]+?)(hula|ula)$

Namespace, novice2:

Ah, I see. The problem was with the first group that was too greedy, not with the second. I was focusing on the latter. Thanks, this works now!