我有一个类似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。
由于
答案 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 =“([^”]适合空标题
.*?>
=匹配标记结尾