0

私はいくつかの正規表現を手に入れましたが、CFEclipse内で見つけた構文を釘付けにするのに苦労しています:

属性名を含まないcfqueryタグのすべてのインスタンス

私はもう試した

<cfquery [^>]*(?!(name=))[^>]*>

私がトラップするつもりだった:

cfquery タグ、終了> 以外の任意の数の文字、NOTの後にname属性、その後に終了 > ではない任意の数の文字、終了>続きます

name属性を含むものと含まないものがあります (したがって、明らかに正しくありません)。

誰かがこれに手がかり棒で私を殴ることができますか? ありがとう!

4

2 に答える 2

2

これには XML パーサーを使用する必要があるように見えますが、問題は[^>]*貪欲であり、存在する場合はname属性を介して一致することです。次のようなものが必要です。

<cfquery (?![^>]*name=)[^>]*>

を否定先読みに移動する[^>]*ことで、次の前の文字列に "name=" が存在しないことを確認できます>

于 2011-08-25T16:27:10.467 に答える
1

開始タグの最後まで各文字に対して先読みを機能させたい場合は、次のように文字クラスと量指定子を分割する必要があります。

<cfquery\b(?:(?!name=)[^>])*>

\bスペースの代わりに (単語境界) に注意してください- これにより、 (タグ<cfquery>をブロックしながらも) 一致が可能になります (英数字の後には、次の文字が非英数字であることを保証します)。<cfqueryparam...>\b

また、指摘する価値があるのは、(?:...)は非キャプチャ グループです - 通常の(...と同様です)が、必要ないため後方参照を作成しません。

もちろん、これが正しく一致しない可能性はわずかにあります。属性を持っている場合、notnameまたはname = "whatever"これらの両方を持っている場合は、正しく処理されません。

これを解決するには、\b今度は名前の前に a を再度使用し、オプションのa を使用し\sて、属性名と等号の間の空白を許可します (必須ではありません)。

<cfquery\b(?:(?!\bname\s*+=)[^>])*>

タグ/属性が混合/大文字である可能性がある場合は、大文字と小文字を区別しないフラグが有効になっていることを確認することを忘れないでください。

于 2011-08-26T13:00:38.957 に答える