|
Windows XP SP1, 秀丸 5.00 β27
再現性が特定しないので心許ない投稿ですが、取り合えず報告します。
末尾のマクロで、
・検索キーワードにマッチしない
・マッチするが、桁位置が異なる
・予期したとおりの結果になる
と言う、ばらついた実行結果になることがあります。
発生する頻度は『超極々まれに』で、エラー・メッセージ等はありません。
予期しない結果の場合でも、以下の流れで編集・実行すると、
1. 検索キーワードの「英単語の始まり」(\<)を削除する。
$p = "class *= *(\"|')?[^ \"'>]+(\"|')?";
2. 予期したとおりの結果になる
3. 検索キーワードの「英単語の始まり」(\<)を書き戻す。
$p = "\\<class *= *(\"|')?[^ \"'>]+(\"|')?";
4. 予期したとおりの結果になる
と不思議な現象が起こります。
サブルーチン製作途中の実験で指定した検索パターンに、たまたま「英単語の始
まり」を含めたと言うだけで、「英単語の始まり」が何か関係しているのかどう
かは分かりません。
検証し難い事案ではあると思いますが、よろしくお願いします。
※予期する結果(メッセージ):
<blockquote class='new' title='sample'>
---------------------------------------------------------------
$s = "<blockquote class ='style' title='sample'>";
$p = "\\<class *= *(\"|')?[^ \"'>]+(\"|')?";
$re = "class='new'";
call SubStr $s, $p, $re;
if( ##return == -1 ) message "マッチしませんでした。";
else if( ##return == -2 ) message "不正な正規表現!";
else message $subStr;
endmacro;
// $$1 = 対象文字列, $$2 = 検索, $$3 = 置換
// 戻り値は、FindRegular の戻り値そのもの
// 置き換え後の文字列は、$subStr に格納
SubStr:
loaddll "HmJre.dll";
if( !result )
{
message "DLLロードに失敗!";
endmacro;
}
##m = dllfunc("FindRegularNoCaseSense", $$2, $$1, 0);
if( ##m >= 0 )
{
##sln = strlen($$1);
##mln = dllfunc( "GetLastMatchLength" );
if( ##m )
{
##i = ##sln - ##m - ##mln;
if(##i) $subStr = leftstr($$1, ##m) + $$3 + rightstr($$1, ##i);
else $subStr = leftstr($$1, ##m) + $$3;
}
else
{
$subStr = $$3 + rightstr($$1, ##sln - ##mln);
}
}
freedll;
return ##m;
---------------------------------------------------------------
|
|