如何使用正则表达式排除某些模式

时间:2013-12-02 09:12:31

标签: c# asp.net regex

大家好我使用以下Regex从窗体中提取控件

string MessageBody = String.Empty;
string filePath = System.Web.HttpContext.Current.Request.PhysicalApplicationPath;
filePath = filePath + "WebForm8.aspx";
using (StreamReader sr = new StreamReader(filePath))
{
   MessageBody = sr.ReadToEnd();
   MatchCollection mLabelCollection1 = Regex.Matches(MessageBody, "(?<openingtag><asp:Label.*?>)(?<content>.*?)(?<closingtag><.*?/asp:Label>)", RegexOptions.Singleline);
}

这工作正常,但我需要提取表单上的标签,并排除某些其他外部控件中的标签,例如Gridview和所有

这是我的aspx部分

<asp:Label ID="lbl" runat="server"></asp:Label>
<asp:GridView runat="server">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:Label ID="lblGrid" runat="server"></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>

我需要在我的正则表达式中排除Gridview标签

根据Alex答案进行更新 enter image description here

<asp:Label ID="lbl" runat="server"></asp:Label>
<asp:GridView runat="server">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:Label ID="lblGrid" runat="server"></asp:Label>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>

从上面的设计中我只需要提取直接放置的标签,并且需要从Gridview或任何外部控件中排除标签,正则表达式后的样本输出应该是<asp:Label ID="lbl" runat="server"></asp:Label>

1 个答案:

答案 0 :(得分:1)

解决方案

(?<unwanted><asp:GridView .*?>.*?(?<openingtag><asp:Label.*?>)(?<content>.*?)(?<closingtag></asp:Label>).*?</asp:GridView>)|(?<wanted>(?<openingtag><asp:Label.*?>)(?<content>.*?)(?<closingtag></asp:Label>))

使用指定的捕获组wanted查找您要查找的标签。

讨论

xml解析器更适合当前的情况。 如果您发现其他标签(如GridView)带来了不需要的标签,您可以像这样自定义模式。

string[] unwantedTags = {"GridView", "MyOtherTag", "AnotherUnwantedTag"};<br>
string unwantedTagsPattern = "(?:" + String.Join("|",unwantedTags) + ")";
string pattern = "(?<unwanted><asp:" + unwantedTagsPattern + ".*?>.*?(?<openingtag><asp:Label.*?>)(?<content>.*?)(?<closingtag></asp:Label>).*?</asp:" + unwantedTagsPattern + ">)|(?<wanted>(?<openingtag><asp:Label.*?>)(?<content>.*?)(?<closingtag></asp:Label>))"