[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
# おや?朝だ