まつもと ゆきひろです
どうも正規表現周りは昔からバグが多くて迷惑かけてます.(_ _)
In message "[ruby-list:6484] Re: gsub"
on 98/02/18, Tadayoshi Funaba <tadf / kt.rim.or.jp> writes:
|ふなばです。
|
|もうひとつ。改行コードで終っている文字列で、\Z がうまくマッチしないみたい
|なんですが、これはどうですか?
いや,実は先日Perl5本を見てて,
\Zは文字列末尾直前の改行にもマッチする
と書いてあってなんのことかなあとずっと思っていたんですが,ちょ
うどゆうべふなばさんが指摘した問題があるからだと気がついて,
修正しました.これもパッチつけておきます.
# Pythonのpcreはこのことを考慮していないみたいなんだがなあ.
|日本語をつかったときも \Z がうまくないみたいなんです。たとえば、
|
| "日本語".gsub!(/(\A|\Z)/, '%')
|
|といったもの。これも日本語でなければ思ったとおりなんです。
これもパッチをつけます.
--- regex.c 1998/01/16 12:19:12 1.1.1.2
+++ regex.c 1998/02/18 01:56:41 1.1.1.2.2.2
@@ -3007,5 +3008,8 @@
- /* Match at the very end of the data. */
+ /* Match at the very end of the data. */
case endbuf:
if (AT_STRINGS_END(d))
+ break;
+ /* .. or newline just before the end of the data. */
+ if (*d == '\n' && AT_STRINGS_END(d+1))
break;
--- string.c 1998/02/18 01:56:42 1.1.1.2.2.6
+++ string.c 1998/02/18 01:58:29
@@ -900,2 +900,3 @@
if (BEG(0) == END(0)) {
+ int len = ismbchar(RSTRING(str)->ptr[END(0)])?2:1;
/*
@@ -905,5 +906,5 @@
if (RSTRING(str)->len > END(0)) {
- str_cat(result, RSTRING(str)->ptr+END(0), 1);
+ str_cat(result, RSTRING(str)->ptr+END(0), len);
}
- offset = END(0)+1;
+ offset = END(0)+len;
}