C# 正则表达式包含在XML元素中

C# 正则表达式包含在XML元素中,c#,regex,xml,C#,Regex,Xml,如何在正则表达式中使用“contains”(“contains”或“%like%”) 我有一个正则表达式将XML节点与精确文本匹配: <([\w]+)[^>]*>sample<\/\1> 预期的正则表达式结果应返回上述所有节点,但当前它仅返回最后一个节点 我创建了。您要查找的是任何标记中“sample”字符串的精确匹配,而不是包含“sample”作为子字符串的字符串。您可以按以下方式修复表达式以获得所有行: <([\w]+)[^>]*>[a-zA

如何在正则表达式中使用“contains”(“contains”或“%like%”)

我有一个正则表达式将XML节点与精确文本匹配:

<([\w]+)[^>]*>sample<\/\1>
预期的正则表达式结果应返回上述所有节点,但当前它仅返回最后一个节点


我创建了。

您要查找的是任何标记中“sample”字符串的精确匹配,而不是包含“sample”作为子字符串的字符串。您可以按以下方式修复表达式以获得所有行:

<([\w]+)[^>]*>[a-zA-Z ]*sample[a-zA-Z ]*<\/\1>
]*>[a-zA-Z]*样本[a-zA-Z]*

您可以使用
XDocument
像这样解析XML:

var s = @"<?xml version=""1.0""?>
  <root>
    <Part>this is sample part</Part>
    <Remarks>this is sample remark</Remarks>
    <Notes>this is sample notes</Notes>
    <Desc>sample</Desc>
  </root>";
var document = XDocument.Parse(s);
var names = document.Descendants()
               .Elements()
               .Where(x => x.Value.Contains("sample")) // all nodes with text having sample
               .Select(a => a.Name.LocalName); // return the local names of the nodes
Console.WriteLine(string.Join("\n", names));
要在XML无效的情况下返回到正则表达式,请使用

<(?:\w+:)?(\w+)[^<]*>[^<]*?sample[^<]*</(?:\w+:)?\1>

作业的工具错误。正则表达式不是XML解析器,也永远不会是。为什么不使用XPath呢<代码> //*[包含(文本()),“样本”] /Loal-NAMEL()/代码> @ WKTROSTRIPBI。谢谢,我正在尝试XPATAN另一个关于XML部分的注释:考虑一个文件,其中XML不是用多条线被很好地格式化,而是所有的节点都在一条线上……或者类似地,XML节点包含跨越多行的内容。如果您认为这两种情况下都有一个可用的正则表达式,那么让我们做一些嵌套:
“这是一个hacky示例注释”
。使用xml linq和包含字符串的where进行搜索。在使用正则表达式之前,请始终使用字符串方法。始终使用eXmlDocument类、XDocument类、XmlReader或XmlSerialization解析xml。我宁愿使用
[^一旦
sample
前面有数字或标点,就不会有任何匹配,因为
[a-zA-Z]*
。我同意你的看法,它当然不涵盖所有情况——例如,可能还有标点符号等——但它给出了问题所在以及如何涵盖问题中提供的特定输入的想法。@grek40它做了一个技巧,不管是否包含任何字符,感谢您的输入]*>[^糟糕的是,这个问题是专门针对正则表达式的……但是这种方法非常适合我的工作,我必须+1它:)@wiktor只是一个简单的问题,性能方面哪一个是最好的选择?Linq/regex/Xpath。因为在处理有效的XML文件时,我会处理大量的XML文件来搜索文本,所以我宁愿使用XML pa如果你必须处理有效或无效的XML文件,正则表达式可以帮助你,速度将取决于内容、XML大小和运气。注意,我每天都要处理无效的XML,我使用正则表达式处理XML-但它不是一个普通的XML,它是TMX文件格式,我有一个专门为它们手工构建的解析器R性能很好。@WiktorStribiż这里也一样,有时我们会收到一些无效的XML格式,这就是选择正则表达式来匹配搜索字符串的原因。让我继续使用正则表达式。非常感谢
var names2 = document.Root.XPathSelectElements("//*[contains(text(), \"sample\")]");
var results = names2.Select(x => x.Name.LocalName));
<(?:\w+:)?(\w+)[^<]*>[^<]*?sample[^<]*</(?:\w+:)?\1>