Subject: regex won't do lazy matching
From: a g <[email-masked]>
To: [email-masked]
Date: Sun, 18 Apr 2010 21:33:30 -0400
List-Id: <debbugs-submit.debbugs.gnu.org>

This may be a usage problem, but it does not exist with other regex packages
(such as slre) and I can't find anything in the documentation to indicate
that the syntax should be different for coreutils. I am using coreutils 8.4
on ubuntu AMD64, version 9.10. I cannot get the coreutils regex matcher to
do lazy matching. Here is my code:

/**** regex_test.cpp ***/
#include <stdio.h>
#include <stdlib.h>
#include "xalloc.h"
#include "regex.h"

// compile:
// gcc -I coreutils-8.4/lib/ -c regex_test.cpp
// g++ -o regex_test regex_test.o coreutils-8.4/lib/xmalloc.o
coreutils-8.4/lib/xalloc-die.o coreutils-8.4/lib/exitfail.o
coreutils-8.4/lib/regex.o

void print_regerror (int errcode, regex_t *compiled)
{
  size_t length = regerror (errcode, compiled, NULL, 0);
  char *buffer = (char *)xmalloc (length);
  if(!buffer) printf("error: regerror malloc failed!\n");
  else {
    (void) regerror (errcode, compiled, buffer, length);
    printf("error: %s\n", buffer);
    free(buffer);
  }
}

int main(int argc, char *argv[]){
  if(argc < 3) printf("usage: regex_test pattern string\n");
  else {
    regex_t rx;
    int err;
    if((err = regcomp(&rx, argv[1], REG_EXTENDED)))
      print_regerror(err, &rx);
    else {
      regmatch_t matches[4];
      if(!regexec(&rx, argv[2], 4, matches, 0)) {
int i;
 printf("match! \n");
for(i = 0; i < 4; i++) {
          if(matches[i].rm_so != -1)
            printf("  s:%i, e:%i", matches[i].rm_so, matches[i].rm_eo);
}
printf("\n");
      } else printf("match failed.\n");
      regfree(&rx);
    }
  }
}
/********/

Here is the problem. If you execute:
  regex_test "a[^x]*?a" "a1a2a"

then you get:
  match!
    s:0, e:5

But, you should get the same result as when you execute *regex_test
"a[^x]*?a" "a1a"*-- that is:
  match!
    s:0, e:3

Please advise. Thank you!