在where子句上正则表达式?

时间:2011-06-03 22:46:19

标签: c# linq where-clause

我正在尝试匹配XML文件上的特定术语并保存结果。这是字符串上的XML文本:

<node1>
  <node2>
    <text>Goodbye</text>
  </node2>
  <node2>
    <text>Welcome James</text>
  </node2>
  <node2>
    <text>Welcome John</text>
  </node2>
  <node2>
    <text>See you later!</text>
  </node2>
</node1>

我想使用linq选择任何欢迎的文本。然而欢迎之后的名字(例如欢迎詹姆斯)可以改变。因此,我试图理解是否有一种简单的方法可以通过正则表达式选择带有任何欢迎名称的节点?

这是C#代码:

private static void Test(string stream)
{
  XDocument doc = XDocument.Parse(stream); //stream contains the xml written above
  var list = from hello in doc.Descendants("node2")
             where attacker.Element("text").Value == "Welcome .*"
             select attacker.Element("text").Value;

  foreach (var x in attackList)
    Console.WriteLine(x);
}

3 个答案:

答案 0 :(得分:5)

对于像您这样简单的场景,不需要使用正则表达式。您可以使用String.StartsWith(String)方法确定字符串是否以指定的字符串开头,如下所示:

private static void Test(string stream)
{
    XDocument doc = XDocument.Parse(stream);
    var list = from hello in doc.Descendants("node2")
               where attacker.Element("text").Value.StartsWith("Welcome")
               select attacker.Element("text").Value;

    foreach (var x in attackList)
    {
        Console.WriteLine(x);
    }
}

答案 1 :(得分:1)

Regex regex = new Regex("Welcome");

XDocument doc = XDocument.Parse(stream); //stream contains the xml written above
var list = from hello in doc.Descendants("node2")
            where regex.IsMatch(attacker.Element("text").Value)
            select attacker.Element("text").Value;

答案 2 :(得分:0)

获取正则表达式匹配的最简单方法是使用静态Regex.IsMatch(String, String)函数

如果想要更好的性能,可以事先编译正则表达式(参见proxon's answer)。

正如Marius提到的那样,String.StartsWith足以满足您的具体示例。