0

次のように設定されている変数があります(カスタムタグの呼び出しにより)

<cfset str = Trim( THISTAG.GeneratedContent ) />

THISTAG.GeneratedContent の内容は次のようになります

FNAME|MNAME|LNAME Test|Test|Test

理解に苦しむコードは次のとおりです。

<cfset str = str.ReplaceAll(
            "(?m)^[\t ]+|[\t ]+$",
            ""
            ) />

<cfset arrRows = str.Split( "[\r\n]+" ) />

上記のコード行は、次の内容の配列を生成する必要があります。

arrRows[1] = FNAME|MNAME|LNAME
arrRows[2] = Test|Test|Test

しかし、配列をダンプすると、次の出力が表示されます。

FNAME|MNAME|LNAME Test|Test|Test

両方の正規表現が何を達成しようとしているのか理解できません。

4

1 に答える 1

3

これです...

<cfset str = str.ReplaceAll(
    "(?m)^[\t ]+|[\t ]+$",
    ""
    ) />

..行頭または行末にあるタブ/スペースを削除しています。は、(通常の「コンテンツの開始」ではなく) 「行の開始」に一致(?m)させる複数行モードをオンにし、同様に、このモードでは (「コンテンツの終了」ではなく) 「行の終了」を意味します。^$

これです...

<cfset arrRows = str.Split( "[\r\n]+" ) />

...連続するキャリッジリターンや改行文字の任意の組み合わせで分割することにより、行を配列に変換しています。


ボーナス情報

次のように、実際にこれら 2 つの正規表現を 1 つの正規表現に組み合わせることができます。

<cfset arrRows = str.split( '\s*\n\s*' ) />

\s任意の空白文字に一致します。つまり[\r\n\t ]、これにより、スペースとタブの削除と配列への変換が組み合わされます。
(改行を探すことで機能するtrimため、前後の空白を削除するには on GeneratedContent が必要であることに注意してください。)

于 2013-09-10T22:46:06.660 に答える