正则表达式否定前瞻

chr*_*ris 3 regex asp.net 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" />
Run Code Online (Sandbox Code Playgroud)

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

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

<asp:TextBox.*?M(?!axLength=).*?/>
Run Code Online (Sandbox Code Playgroud)

我很想看到更好的解决方案.

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

Ala*_*ore 5

我想这就是你想要的:

<asp:TextBox(?:(?!MaxLength=|>).)*/>
Run Code Online (Sandbox Code Playgroud)

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

<asp:TextBox ID="txtMisc" /><asp:TextBox MaxLength="50" />
Run Code Online (Sandbox Code Playgroud)

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

Visual Studio版本将是:

\<asp\:TextBox(~(MaxLength=|\>).)*/\>
Run Code Online (Sandbox Code Playgroud)

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