0

私はこの正規表現を作成しようとしていますが、それは私を狂わせています。私が基本的に必要としているのは<body>、サーバー側のコードで書かれていないすべてのタグを検出する正規表現です。<body>私の計画は、これらすべてのタグを のようなものに置き換えることです<body><%=CallToFunction()%>

(これは 内の検索と置換の一部ですUltraEdit。)

例えば:

<body>                                          //should be found
<body class="normal">                           //should be found
<body class="<% Response.Write("normal") %>"    //should be found
<html><body class="normal">                     //should be found

Response.Write("<body class=""normal"">")       //should not be found (a)
Response.Write(" <body>")                       //should not be found (b)
Response.Write("<html><body><h1>...")           //should not be found (c)

message = "<html><body>...</body></html>"       //should not be found (d)
Response.Write(message)

Response.Write("<html>
                <head></head>
                <body class=""normal"">
                    <h1>...</h1>")              //should not be found (e)

私が現在持っている正規表現は次のとおり([^"]<body.*[^>]*>)です。しかし、そこにある問題は、と の<body>間にスペースがあるタグをまだ見つけてしまうことです(例 を参照)。また、まだ見つかります。<body>"(a)(c)

そして、(e)私は本当に無知です。それを検出することさえ可能かどうか疑問に思います。

誰でも私を助けることができますか?

ありがとう!

編集

私は今、^(?!Response|")(<body.*[^>]*>)かなりうまく機能するものを持っています。<body>ただし、ドキュメント内でタグがインデントされている場合は機能しません。したがって、 or 以外のもの (または何もないもの) を先頭に追加するようなものが必要<bodyです。Response"

答え

最終的に使用することになった正規表現は、Michael Allen の回答に基づいており、次のとおりです。

^(?!Response|")([\t ]*)(<body.*[^>]*>)

解決しませんでし(e)たが、その場合は手動で作業を行うと思います。

4

1 に答える 1

1

最後の例をどのように処理するかはよくわかりませんが、次の正規表現は、提供した他のすべての例と正しく一致します。

^(?!Response).*<body.*>

Responseここでの秘訣は、否定先読みを使用して、先頭に含まれる一致をノックアウトすることです。

うまくいけば、それがあなたの始まりです。

于 2013-01-24T15:11:56.727 に答える