3

ColdFusion の REFindNoCase 関数を取得して、一致する文字列の複数のインスタンスを返そうとしていますが、機能していないようです。

<cfset string2test="cfid skldfjskdl cfid sdlkfjslfjs cftoken dslkfjdslfjks cftoken">
<cfset CookieCheck =  REFindNoCase( 'CFTOKEN', string2test, 1, true)>
<cfif arrayLen( CookieCheck['LEN'] ) gt 1>
    MULTIPLE CFTOKEN!
</cfif>

複数を検索するために使用する必要がある正規表現の魔法の構文はありますか?

4

3 に答える 3

1

文字列をループするカスタム メソッドを作成し、出現するたびに配列 (または構造体、または必要なもの) に投げ込むことができます。これが私がそれにアプローチする方法の例です:

<cfscript>
public array function reFindMatches(required string regex, required string str) {
    var start = 1;
    var result = [];
    var matches = [];
    var match = '';
    do {
        matches = ReFind(arguments.regex, arguments.str, start, true);
        if ( matches.pos[1] ) {
            match = matches.len[1] ? Mid(arguments.str, matches.pos[1], matches.len[1]) : '';
            ArrayAppend(result, match);
            start = matches.pos[1] + matches.len[1];
        }
    } while(matches.pos[1]);
        return result;
}

testString = 'cfid skldfjskdl cfid sdlkfjslfjs cftoken dslkfjdslfjks cftoken';
regex = '(?i)(\bcftoken\b)';
check = reFindMatches(regex=regex, str=testString);

WriteDump(var=check);
</cfscript>

私が含めた正規表現の例(?i)は、検索で大文字と小文字が区別されないことを示しています。したがって、呼び出す必要はありませんReFindNoCase...使用したい正規表現を単純に渡すことができます。

上記のコードは、単語cftokenを含む 2 つの要素を持つ配列を出力する必要があります。

于 2013-09-10T20:10:05.060 に答える
0

インスタンスの数をカウントする必要がある場合は、 rematch (または rematchNoCase) を使用します。


複数の があるかどうかを識別するだけで よい場合は、次のようにできます。

<cfset FirstInstance = refindNoCase( 'cftoken' , string2test ) />

<cfif FirstInstance AND refindNoCase( 'cftoken' , string2test , FirstInstance+7 ) >
    ... more than one instance ...
</cfif>

これは、部分式を使用したり、複数回ループしたりして、おそらく再一致よりも効率的です。


関連するデータによっては、次のようなことを行う方がさらに効率的かもしれません:

<bfif string2text.indexOf('cftoken') NEQ string2text.lastIndexOf('cftoken') >

(つまり、追加のインスタンスが常に文字列の末尾近くにあることがわかっている場合、最初のインスタンスはそうではありません。)

于 2013-09-12T00:21:10.900 に答える