1

我有一个类似 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" />

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

有人可以帮我创建这个 RegEx 吗?顺便说一下,这是针对 .NET 的。

谢谢

4

4 回答 4

0

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

while (line = nextline())
  if (re_match(/title=""/, line) || !re_match(/title=/, line)) 
    add_line_to_results(line);
于 2012-08-17T22:48:59.033 回答
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,只要您可以从中提取片段,它仍然可以被解析。老实说,我认为这是一种更好/更快/更简单的方法。

于 2012-08-17T22:46:39.147 回答
0

怎么样

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

(?m-s)= 逐行处理

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

<siteMapNode= 匹配标签

(?!.*title="[^"])= 非捕获测试条件不能匹配 title="([^"] 满足空标题的情况

.*?>= 匹配到标签的结尾

于 2012-08-17T22:57:06.323 回答
0

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

于 2012-08-17T22:37:39.537 回答