Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 正则表达式负前瞻_Asp.net_Regex_Lookahead_Regex Lookarounds - Fatal编程技术网

Asp.net 正则表达式负前瞻

Asp.net 正则表达式负前瞻,asp.net,regex,lookahead,regex-lookarounds,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

在这种情况下,我需要在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=).*?/>

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


注意:VisualStudio搜索因上面的模式而受阻。我被迫使用另一个应用程序来实际使用此模式进行搜索

试试这个。。。元素中“MaxLength”的负前瞻性

\<(?!.*MaxLength[^/>]*)[^/>]*/\>
\]*)[^/>]*/\>

我想这就是你想要的:

<asp:TextBox(?:(?!MaxLength=|>).)*/>
…您希望它与第一个标记匹配,但事实并非如此,因为前瞻在第二个元素中看到
MaxLength=
。像
*?
这样的非贪婪量词不会阻止这种情况发生。看起来它工作正常,但这只是因为标记通常出现在单独的行上,并且
与换行符不匹配

Visual Studio版本将是:

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

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

使用正则表达式不会有好的解决方案。为什么不使用XML解析器解析代码并使用XPath呢?更简单、更可靠。@Konrad:好主意,另一种选择是创建一个需要该属性的XML模式,并根据该模式验证所有文件。实际上@Konrad,事实证明,使用正则表达式有一个非常好的解决方案,我可以在VS中搜索我的VS项目,而不必打开第三方xml解析器。VS特定模式\])*/\>运行速度快且完美无瑕(请参阅此线程的其他答案)。如果有效-非常好。但是请注意,这种模式将无法找到许多特殊情况(这对您来说可能不是问题),例如,
–显然您希望找到这种情况,对吗?+1但是如果您使用
[^>]则无需在否定前瞻中进行交替
而不是像这样的点:
])*/>
这对于匹配和非匹配都更有效。只是说。。。8^@ridge:是的,但我选择这种方式,因为我认为对于不熟悉这种技术的人来说,它更容易阅读。更严重的是,我关闭了
=
,因此它错误地匹配了属性值中碰巧包含
MaxLength
的标记,而不仅仅是名为
MaxLength
的属性的标记。现在修好了,谢谢大家!此解决方案工作完美,适应性强。我完全不知道VS正则表达式语法中的这些差异,所以这是一个额外的好处。我发现[^>]的使用速度明显加快。我的最后一次改编是\])*/\>我无法表达这为我节省了多少时间,我是多么感激你的洞察力。
\<asp\:TextBox(~(MaxLength=|\>).)*/\>