正则表达式否定前瞻

时间:2011-03-29 17:03:32

标签: asp.net regex lookahead regex-lookarounds

我遇到一种情况,我需要在VS项目中搜索没有定义MaxLength属性的任何控件。

例如:

<asp:TextBox ID="txtName" runat="server" MaxLength="50" Text="Enter Name" />
<asp:TextBox ID="txtOther" MaxLength="25" runat="server" />
<asp:TextBox ID="MaxLength" runat="server" />
<asp:TextBox ID="txtMisc" runat="server" Width="100" />

是否有人建议使用正则表达式模式来查找没有定义MaxLength的控件?

我对此的第一次尝试,似乎有效,但最多似乎并不完美......

<asp:TextBox.*?M(?!axLength=).*?/>

我希望看到更好的解决方案。

注意:Visual Studio搜索在我上面的模式中窒息。我被迫使用不同的应用程序来实际使用此模式进行搜索

2 个答案:

答案 0 :(得分:5)

我认为这就是你想要的:

<asp:TextBox(?:(?!MaxLength=|>).)*/>

.一次消耗一个字符,但只有在前瞻确定它不是>MaxLength=的开头之后。请注意,必须在前瞻中排除>,否则它将继续在当前元素的末尾查找MaxLength=。例如,应用于

<asp:TextBox ID="txtMisc" /><asp:TextBox MaxLength="50" />

...您希望它与第一个标记匹配,但它不会,因为前瞻在第二个元素中看到MaxLength=。像.*?这样的非贪婪量词不会阻止这种情况发生。它可能似乎就像它正常工作一样,但这只是因为标签通常出现在单独的行上,.与新行不匹配。

Visual Studio版本将是:

\<asp\:TextBox(~(MaxLength=|\>).)*/\>

<>:在VS正则表达式中都有特殊含义,必须进行转义,~(...)是VS前瞻性的语法。

答案 1 :(得分:1)

尝试这个......元素

中“MaxLength”的负面预测
\<(?!.*MaxLength[^/>]*)[^/>]*/\>