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"

回答

我最终使用的正则表达式基于迈克尔艾伦的回答,并且是:

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

它没有解决(e),但我想我会为这些情况做一些手动工作。

4

1 回答 1

1

不确定您将如何处理最后一个示例,但以下正则表达式将与您提供的所有其他示例正确匹配。

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

这里的技巧是使用 Negative lookahead 来剔除Response开头包含的任何匹配项。

希望这对你来说是一个开始。

于 2013-01-24T15:11:56.727 回答