|
秀まるお2 さん
お返事ありがとうございます。
> JRE2構造体の中のnStartの値が違うことによって結果が違ってるだけとか?
nStart は、文字列を変える場合は毎回手動で 0 に設定しております。
今回デバッガを使い、jre2 / JREFUZZYDATA 構造体の各変数を確認しても、私自身の
設定ミスなどが理解している範囲では考えられなかった為、質問させていただきまし
た。
動作としては、何かしらのキャッシュが残ってるためと感じています。
以下の様な文字列に対して後方参照を行うと、発生が確認できました。
まず成功のパターンを書きます。
( 初期化は省いてます、またプログラムコードなので \ が各所入っています )
----------------------------------------------
1.
// 【A】コンパイル
Compile( "(<dt>[^<]*)(<font color=\"[^\"]*\"><b>)([^<]*)(<a href=\"mailto:[^
\"]*\">)*([^>]+)(</a>)*(</b></font>)(.+$)");
// 【B】検索( Find の最初では nStart は 0 にします )
Find( "<dt>343 :<font color=\"green\"><B>名無し</b></font>:2000/01/01(金)
20:16:17 ID:xxxxxxxx<dd> てすと <br> てすと <br><br>" );
// 【C】4番目の後方参照を得る →この場合、見つからない事が目的
int area=0, pos, realpos;
pos = JreGetTagPosition( &jre2, '4', &area );
realpos = fy_Fuzzy_FindPos2RealPos( &fuzy, pos );
if( realpos!=-1 ){
Fuzzy_FindArea2RealArea( &fuzy, pos, &area );
}
// 【D】4番目の要素 <a href=... は見つからないので、範囲外の値が返却される。
printf( "%d : %d\n", realpos, area );
-----------------------------------------------
そして上記を実施する前に、以下に記載する文字列で「コンパイル&検索」を実施す
ると、
上記での後方参照で得られる範囲が変わってしまいます。
2.
// 【A】コンパイル(先ほどと、全く同等の値です)
Compile( ... );
// 【B】検索( mailto: が含んでる場合です )
Find( "<dt>9 :<font color=\"green\"><B><A HREF=\"mailto:sage\">1</A></b></f
ont>:2000/01/01(金) 22:29:36 ID:xxxxxxxx<dd> ほげほげ<br><br>" );
ここでは 【C】【D】 は期待通りの値です。2の一連の作業を実施した後、
1の手続き【A】【B】【C】【D】を踏むと、1での「後方参照」で得られる値が
変化します。
( なお2以外の、ヒットしない文字列を与えた場合は問題ありません )
秀丸オプションとしては FUZZYOPTION_NOSPACE は OFF にしており、
それ以外はデフォルト値です。
まとめると、
以下のフローで「正規表現検索」した場合、1C で得られる「後方参照値」が
2A 〜 2D を "実施したかどうかにより" 変化します。
【2A】→【2B】→【2C】→【2D】→
【1A】→【1B】→【1C】→【1D】
2A で与えている「検索対象文字列」を一致させない場合は、
期待通りの後方参照値が返って来ます。
長ったらしくなってしまい申し訳ございません。
> そういう認識でいいはずです。
>
> 同じ検索文字列で繰り返し検索する場合には、
>
> Fuzzy_ConvertTarget
> Fuzzy_RealPos2FindPos
> JreGetMatchInfo
> Fuzzy_FindArea2RealArea
>
> を呼び出すのを繰り返すだけになります。CompileやOpen/Closeを毎回呼んだ
>ら多少遅くなります。
>
>> 今まではこのような使い方をしていて問題がなかったのですが、特定のケースで結果
>> が異なる現象が確認出来たので、そもそもの仕様を確認したかった次第です。
>
> JRE2構造体の中のnStartの値が違うことによって結果が違ってるだけとか?
>
> 参考までに、秀丸メールの中にある検索の処理のソースコードを一部(繰り返
>し呼び出す部分の処理)掲載します。
>
>BOOL FINDPACK::JreGetMatchInfo( char* pszBuffer, int cchBuffer ) {
> if( szFind[0] == '\0' ) {
> return FALSE;
> }
> BOOL fHmFuzzy = fFuzzy && pfnFuzzy_Open != NULL;
> int nStartOrigin = jredata.nStart;
> BOOL fWordFuzzyMatch = FALSE;
> if( fHmFuzzy ) {
> pfnFuzzy_ConvertTarget( &fuzzydata, pszBuffer );
> pszBuffer = fuzzydata.pszTargetConved;
> cchBuffer = (int)strlen(pszBuffer);
> jredata.nStart = pfnFuzzy_RealPos2FindPos( &fuzzydata, nStartOrigin );
> fWordFuzzyMatch = fWordOnly;
> }
> BOOL fFound;
> if( !fFindEachLine ) {
> fFound = pfnJreGetMatchInfo_V318( &jredata, pszBuffer, cchBuffer, f
>WordFuzzyMatch, &fuzzydata );
> } else {
> fFound = FALSE;
> // fFindEachLineの場合の処理。cCRInSearch + 1行づつ検索しないといけ
>ない。面倒!
> ...
> ... (省略)
> ...
> }
> if( fHmFuzzy ) {
> jredata.nStart = nStartOrigin;
> if( fFound ) {
> jredata.nPosition = pfnFuzzy_FindArea2RealArea( &fuzzydata, jre
>data.nPosition, (int*)&jredata.nLength );
> }
> }
> return fFound;
>}
|
|