サーチ…


前書き

ColdFusionが持つ正規表現関数の限界を発見するときに、一般的な正規表現で単純な文字列の置き換え以上のものを必要とするなら、あなたは確かに問題に遭遇し、壁に衝突します。 phpのpreg_replace_callbackような組み込み関数はありません。

パラメーター

パラメータ詳細
re 正規表現
str 正規表現に適用する文字列
callback 一致した場合に捕捉されたグループ化が渡される関数。そこでマッチを処理することができます

備考

ColdFusion自体は私たちが望むものを提供しないので、ColdFusionの上にある、われわれの知る限りでは、さまざまなJavaに頼っています。 Javaはjava.util.regex.Pattern提供しています。

実際にはここにあります:

  1. PatternクラスオブジェクトからCompileメソッドを呼び出し、それに正規表現パターンを渡します(おそらく後で使用するために正規表現パターンを格納します)。
  2. Compileメソッドが返すものについてMatcherメソッドを呼び出し、パターンを実行する場所の文字列を渡します。
  3. 一致が成功したかどうかをテストするには、 Matcherメソッドが返すものに対してfindメソッドを呼び出しfind

matcher.find()trueを返すtrue 、「それだけです」と言うこともできますが、考慮する必要がある点が1つあります。JavaのPatternオブジェクトはグループを格納し、別の関数を介してアクセスします。他のプログラミング言語がこのケースをどのように扱うかに関して一貫したものではない。したがって、捕捉されたグループを含む配列をコールバック関数に渡すことができるように、 matcher.group()をループします。そして今我々は言うことができる: "それはそれです!

ユーザー定義のREReplaceCallback関数

function REReplaceCallback(re,str,callback) {
    /*
        Thanks to Ben Nadel
        "Learning ColdFusion 8: REMatch() For Regular Expression Matching"
        from 2007-06-13
        https://www.bennadel.com/blog/769-learning-coldfusion-8-rematch-for-regular-expression-matching.htm
    */
    pattern = CreateObject("java","java.util.regex.Pattern").Compile(Arguments.re);
    matcher = pattern.Matcher(Arguments.str);
    if(matcher.find()) {
        groups = [];
        for(var i = 1; i lte matcher.groupCount(); i++) {
            ArrayAppend(groups,matcher.group(Val(i)));
        }
        return Arguments.callback(groups);
    }
    else {
        return Arguments.callback(false);
    }
}

REReplaceCallback関数を使用する

REReplaceCallback('YOUR REGEX GOES HERE','AND YOUR STRING HERE',function(groups) {
    //now you can access the 'groups' array containing all the captured groups
    return result; //return whatever you've processed inside
});


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow