寻找RegEx来获取与属性不匹配的元素

时间:2012-08-17 22:22:44

标签: c# regex

我有一个类似XML的文件,其行如下所示:

<siteMapNode title="Our Clients" url="~/OurClients">
    <siteMapNode title="Website Portfolio" url="~/OurClients/Portfolio" />
    <siteMapNode title="Testimonials" url="~/OurClients/Testimonials" />
</siteMapNode>

<siteMapNode title="Contact" url="~/Contact" />
<siteMapNode title="" url="~/Pharmacy" />
<siteMapNode url="~/ClinicWebsiteDevelopment" />
<siteMapNode url="~/HospitalWebsiteDevelopment" />

注意大多数行都有title属性?我想要做的是使用RegEx捕获所有没有title属性的元素,并且我想捕获所有具有空标题属性title=""的行。所以在通过RegEx运行我的示例后,它应该返回我最后三行,因为最后两行没有title属性,之前的行有一个空的title属性。

有人可以帮我创建这个RegEx吗?顺便说一下,这适用于.NET。

由于

4 个答案:

答案 0 :(得分:0)

使用linq到xml 这里有一个解释 http://www.codeproject.com/Articles/24376/LINQ-to-XML

答案 1 :(得分:0)

如果您愿意添加伪造的根元素(假设没有),您可以使用Linq2XML轻松完成此操作:

string foo = @"<bogus><siteMapNode title='Our Clients' url='~/OurClients'>
                <siteMapNode title='Website Portfolio' url='~/OurClients/Portfolio' />
                <siteMapNode title='Testimonials' url='~/OurClients/Testimonials' />
                </siteMapNode>

            <siteMapNode title='Contact' url='~/Contact' />
            <siteMapNode title='' url='~/Pharmacy' />
            <siteMapNode url='~/ClinicWebsiteDevelopment' />
            <siteMapNode url='~/HospitalWebsiteDevelopment' /></bogus>";


XDocument doc = XDocument.Parse(foo);

var elements = doc.Root.Elements("siteMapNode");
foreach (var elem in elements) {
    if (elem.Attribute("title") == null)
        Console.WriteLine("This one doesn't have the attribute!");
}

无需使用正则表达式。 Regexen应该从不用于解析标记。即使您的文档格式不是有效的XML,只要您可以从中提取片段,它仍然可以被解析。老实说,我认为这是一个更好/更快/更简单的方法。

答案 2 :(得分:0)

通常,您不能编写正则表达式来匹配具有字符串的行。相反,编写一个与你想要的匹配的正则表达式,循环遍历行,针对正则表达式测试它们,如果测试失败,则将行添加到结果列表中。所以它会是这样的(这是伪代码,而不是真正的C#):

while (line = nextline())
  if (re_match(/title=""/, line) || !re_match(/title=/, line)) 
    add_line_to_results(line);

答案 3 :(得分:0)

怎么样

(?m-s)^\s*<siteMapNode (?!.*title="[^"]).*?>

(?m-s) =逐行处理

^\s* =在开始时匹配可选空格

<siteMapNode =匹配标记

(?!.*title="[^"]) =非捕获测试条件无法匹配title =“([^”]适合空标题

.*?> =匹配标记结尾