Regex Negative Lookahead - PullRequest
       4

Regex Negative Lookahead

3 голосов
/ 29 марта 2011

У меня есть ситуация, когда мне нужно искать в проекте 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 ]

5 голосов
/ 30 марта 2011

Я думаю, это то, что вы пытались:

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

. потребляет по одному символу за раз, но только после того, как предвидение определило, что это не > или начало MaxLength=. Обратите внимание, что вы должны исключить > в прогнозе, или он будет продолжать искать MaxLength= за пределами конца текущего элемента. Например, применительно к

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

... вы хотите, чтобы он соответствовал первому тегу, но это не так, потому что предвидение видит MaxLength= во втором элементе. Нежадный квантификатор, такой как .*?, не предотвратит этого. Может показаться, , что он работает правильно, но это только потому, что теги обычно появляются в отдельных строках, а . не соответствует символам новой строки.

Версия Visual Studio будет:

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

<, > и : имеют специальное значение в регулярных выражениях VS и должны быть экранированы, а ~(...) - это синтаксис VS для отрицательного взгляда.

1 голос
/ 29 марта 2011

Попробуйте это ... отрицательный взгляд на "MaxLength" внутри элемента

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