GNU bug report logs - #5970
regex won't do lazy matching

Previous Next

Package: coreutils;

Reported by: a g <mewalig <at> gmail.com>

Date: Mon, 19 Apr 2010 02:02:01 UTC

Severity: normal

Done: Bob Proulx <bob <at> proulx.com>

Bug is archived. No further changes may be made.

Full log


Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: a g <mewalig <at> gmail.com>
To: bug-coreutils <at> gnu.org
Subject: regex won't do lazy matching
Date: Sun, 18 Apr 2010 21:33:30 -0400
[Message part 1 (text/plain, inline)]
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!
[Message part 2 (text/html, inline)]

This bug report was last modified 15 years and 24 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.