C# 正在寻找正则表达式以获取不带';不匹配属性

C# 正在寻找正则表达式以获取不带';不匹配属性,c#,regex,C#,Regex,我有一个类似XML的文件,其中的行如下所示: <siteMapNode title="Our Clients" url="~/OurClients"> <siteMapNode title="Website Portfolio" url="~/OurClients/Portfolio" /> <siteMapNode title="Testimonials" url="~/OurClients/Testimonials" /> </sit

我有一个类似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属性吗?我要做的是使用正则表达式捕获所有没有
title
属性的元素,并捕获所有具有空title属性的行
title=“”
。因此,在通过正则表达式运行我的示例之后,它应该返回我的最后三行,因为最后两行没有title属性,前面的一行有空title属性

有人能帮我解决这个正则表达式吗?顺便说一下,这是给.NET的

谢谢

使用linq转换xml 这里有一个解释

如果您愿意添加一个伪造的根元素(假设没有),那么使用Linq2XML可以很容易地做到这一点:

stringfoo=@”
";
XDocument doc=XDocument.Parse(foo);
var elements=doc.Root.elements(“siteMapNode”);
foreach(元素中的变量元素){
if(元素属性(“标题”)==null)
WriteLine(“这个没有属性!”);
}

不需要使用正则表达式。决不能使用Regexen来解析标记。即使文档的格式不是有效的XML,只要可以从中提取片段,也可以对其进行解析。老实说,我认为这是一种更好/更快/更简单的方法。

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

怎么样

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

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


=匹配标签末尾

如果你自己喜欢,为什么你希望别人感到痛苦?将XML读入XML并使用相应的机制获取值要容易得多。。。考虑为什么要使用正则表达式来解析一般不可通过ReGEX定义的东西……使用XPath,简单地使用.NET和更合适的方法来做这些。它是一种专有格式。我给出的示例看起来像XML,但它不是符合任何已知标准的标准XML。使用xpath会引发错误。LINQtoXML可以很好地处理这样的片段。您所要做的就是遍历文档节点并找到属性为null的节点。是的,如果您的regexp库实现了完整的PCRE,那么您可以忽略负的look behinds和lookaheads。我认为
/^(?。*\btitle=.*$)\btitle=“”/
可以。是的.Net支持它们,但是你应该缩短到只避免
title=“[^]”]
为了让答案更通用,(?m-s)^\s*应该适用于任何元素名称,同时仍然避免关闭标记。在我所有的回答中,这可能是最好的方法。非常感谢。
while (line = nextline())
  if (re_match(/title=""/, line) || !re_match(/title=/, line)) 
    add_line_to_results(line);
(?m-s)^\s*<siteMapNode (?!.*title="[^"]).*?>