1

ColdFusion の正規表現には少し問題があります。

私は文字列を持っています:

Hi my name is {firstname}. and i live in {towncity} my email address is {email}

私が知りたいのは、一連の{}括弧内に含まれている文字列内のすべての文字列をどのように見つけるかということです。一致するすべての文字列を配列に分割して、クエリ データの結果を使用できるようにしたいと考えています。

また、これは変数データをマージするために一致する文字列内の文字列を処理するために一般的に使用されるパターンですか?

どんな助けでも大歓迎です。

4

3 に答える 3

5

簡単な答え

中括弧で囲まれたすべての文字列を見つけるには、一致と単純な式を使用できます\{[^{}]+\}

説明

各中括弧の前のバックスラッシュ\はそれらをエスケープし、文字通りの中括弧として機能させます (それ以外の場合は特別な意味を持ちます)。

[^...は負の]文字クラスであり、含まれている文字の 1 つではない単一の文字に一致することを示し、貪欲な+量指定子は、前の項目からできるだけ多く、ただし少なくとも 1 つに一致するように指示します。

したがって[^{}]+、中括弧の間で使用すると、ネストされた中括弧または一致しない中括弧と一致しないことを意味します。( using\{.*?\}は 2 つの左中かっこに一致する可能性があります。注:*?は遅延量指定子であり、(可能であれば) 何にも一致しませんが、必要な数だけ一致します。)

詳細な回答

ただし、結果はクエリから得られると言うので、扱っている値のみを一致させる方法は、クエリの ColumnList を使用して式を形成することです。

`\{(#ListChangeDelims(QueryName.ColumnList,'|')#)\}`

これにより、ColumnList がパイプで区切られたリスト (括弧でグループ化された代替のセット) に変更されます。つまり、生成されたパターンは次のようになります。

 \{(first_name|towncity|email)\}

(そのグループの内容がキャプチャ グループ 1 に移動します)。

実際にテキストを入力するには(単に一致させるのではなく)、同様のことを行うことができますが、ここでは正規表現が必要ないことを除いて、列をループしながら単純に置き換えるだけです:

<cfloop index="CurColumn" list=#QueryName.ColumnList#>
    <cfset text = replace( text , '{#CurColumn#}' , QueryName[CurColumn][CurrentRow] , 'all' ) />
</cfloop>

(これは標準的な置換であるため、中括弧をバックスラッシュでエスケープする必要はありません。ここでは特別な意味はありません。)

于 2013-02-03T14:24:50.560 に答える
1

機能を使用してくださいreMatch(reg_expression, string_to_search)

Coldfusion 10 の正規表現の詳細については、こちらを参照してください。(CF8 の正規表現はほぼ同じになると思います。)

次のコードを使用します。

<cfset str = "Hi my name is {firstname}. And I live in {towncity} my email address is {email}.">
<cfoutput>Search string: <b>#str#</b><br />Search result:<br /></cfoutput>
<cfset ret = reMatch("\{[\w\s\(\)\+\.@-]+\}", str)>
<cfdump var ="#ret#">

これは、次のエントリを含む配列を返します。

  • {ファーストネーム}
  • {タウンシティ}
  • {Eメール}

CF 正規表現の[]括弧は、単一の文字に一致する文字セットを定義します。+内で定義された文字セットからの 1 つまたは複数の文字に一致するように、角かっこの後に置き[]ます。たとえば、1 つ以上の大文字に一致させるには、 と書くことができます[A-Z]+

上記のリンクで詳しく説明されているように、CF はさまざまな文字に一致するショートカットを定義しています。コードで使用したのは、\w英数字またはアンダースコア\sに一致するもの、空白文字 (スペース、タブ、改行などを含む) に一致するものです。

次の特殊文字に一致させるには、それらの前に+*?.[^$({|\バックスラッシュを記述してエスケープ\します。

これに対する例外は-、バックスラッシュでエスケープできないダッシュ文字です。したがって、これをリテラルとして使用するには、上記で行ったように、文字セットの最後に配置するだけです。

上記の正規表現を使用すると、たとえば、次の文字列から文字を抽出できます。

<cfset str = "Hi my name is { John Galt}. And I live in {St. Peters-burg } my email address is {john@exam_ple.com}.">

結果は、次のエントリを持つ配列になります。

  • {ジョン・ガルト}
  • {セント。サンクトペテルブルク}
  • {john@exam_ple.com}
于 2013-02-03T05:30:55.423 に答える
0

これを行うにはもっと良い方法があるかもしれませんが、次のようなものを使用するとrematch( '{.*?}', yourstring )、すべての一致の配列が得られます。

今後の参考のために、私はこれを優れたオンライン正規表現チェッカーであるRegExrで行いました。完全な開示、これは ColdFusion専用ではありませんが、物事をテストするための優れた方法です。

于 2013-02-03T04:28:36.367 に答える