[ruby-dev:3512] Re: [BUG] regexp (?= )

From: 新井 康司 <JCA02266@...>
Date: 1998-09-14 21:36:35 UTC
List: ruby-dev #3512
新井です。

> perlとrubyで以下のパターンマッチの動作が異なります。
> 
> print "1\n" if "foobar" =~ /foo(?=(bar)|(baz))/;
> print "2\n" if "foobaz" =~ /foo(?=(bar)|(baz))/;

/foo(?=bar|baz)/
のパターンを re_compile_pattern()した結果

"\001\003foo\033\021\000\t\b\000\001\003bar\000\000\000\001\003baz\034\000"
                                           ^^^^^^^^^^^^
                                    ここが空になってました。

というわけで、パッチです。

--- regex.c.org Tue Sep 15 05:09:55 1998
+++ regex.c     Tue Sep 15 05:28:11 1998
@@ -1585,10 +1585,6 @@
          if ((options ^ stackp[-1]) & RE_OPTION_IGNORECASE) {
            BUFPUSH((options&RE_OPTION_IGNORECASE)?casefold_off:casefold_on);
          }
-         options = *--stackp;
-         switch (c = *--stackp) {
-           case '(':
-           case ':':
              pending_exact = 0;
              if (fixup_alt_jump)
                { /* Push a dummy failure point at the end of the
@@ -1601,7 +1597,10 @@
                     to `fixup_alt_jump', in the `handle_alt' case below.  */
                  store_jump(fixup_alt_jump, jump, b);
                }
-             if (c == '(') {
+         options = *--stackp;
+         switch (c = *--stackp) {
+           case '(':
+             {
                char *loc = bufp->buffer + *--stackp;
                *loc = regnum - stackp[-1];
                BUFPUSH(stop_memory);

こんなんしてみましたが、いかがでしょう?

あまり、細かいところは見てないですが、解決の糸口に
なれば幸いです。まつもとさん再び検証お願いします。

あっインデントは適当に直してくださいね ^^;

一応、以下はperlとrubyで同じ動作をするようになりました。

print "1..1\n" if "foobar" =~ /foo(bar|baz)/;
print "1..2\n" if "foobaz" =~ /foo(bar|baz)/;
print "2..1\n" if "foobar" =~ /foo(?:bar|baz)/;
print "2..2\n" if "foobaz" =~ /foo(?:bar|baz)/;
print "3..1\n" if "foobar" =~ /foo(?=bar|baz)/;
print "3..2\n" if "foobaz" =~ /foo(?=bar|baz)/;
print "4..1\n" if "foobar" =~ /foo(?!bar|baz)/;
print "4..2\n" if "foobaz" =~ /foo(?!bar|baz)/;
print "5\n"    if "foobar" =~ /foo(?i)(bar|baz)/;

=>
1..1
1..2
2..1
2..2
3..1
3..2
5

# おや?朝だ

In This Thread

Prev Next