【问题标题】:Regex in Linq statement?Linq 语句中的正则表达式?
【发布时间】:2013-06-04 16:20:22
【问题描述】:

我正在编写一个简短的 C# 来解析给定的 XML 文件。但是其中 1 个标记值可以更改,但始终在 where 子句中包含单词“Fast Start up”(不考虑大小写和空格,但需要以相同的顺序)。我不确定如何在 C# 中的类似 sql 语句中执行此操作。

var selected = from cli in doc.Descendants(xmlns+ "Result")
     where cli.Element(xmlns + "ResultsLocation").Value == "Assessments-Fast-Startup"
                       select cli;

【问题讨论】:

  • sql在哪里? - 我看到的只是 linq to xml
  • 您是在寻找确切的字符串,还是类似:fast*startup

标签: c# regex linq linq-to-xml


【解决方案1】:

假设您正在寻找确切的字符串 - 您可以使用 String.Contains 吗?

var selected = from cli in doc.Descendants(xmlns+ "Result")
     where cli.Element(xmlns + "ResultsLocation").Value.Contains("Assessments-Fast-Startup")
     select cli;

否则,类似:

var rx = new Regex("fast(.*?)startup", RegexOptions.IgnoreCase);

var selected = from cli in doc.Descendants(xmlns+ "Result")
    where rx.IsMatch(cli.Element(xmlns + "ResultsLocation").Value)
    select cli;

【讨论】:

  • 不,这只是说“快速{任何东西}启动”。您可以忽略正则表达式定义中的大小写
【解决方案2】:

fast[- ]?start[- ]?up 的正则表达式应该可以工作

其中一个可选的 dash空格 可以分隔单词部分

...
where Regex.IsMatch(
    cli.Element(xmlns + "ResultsLocation").Value, 
    "fast[- ]?start[- ]?up", 
    RegexOptions.IgnoreCase
)
select cli

如果您发现需要调整正则表达式,请尝试像 http://regexpal.com/ 这样的正则表达式测试器

正如@DaveBish 所提到的,您可以使用.Contains(...) 测试而不是正则表达式甚至.ToLower().Contains(...) 链接(您可能还需要null 检查)

【讨论】:

    猜你喜欢
    • 2011-05-01
    • 1970-01-01
    • 2021-04-07
    • 2012-03-26
    • 2011-08-21
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多