2017-08-03 30 views
3

我想知道是否有可能在linq请求中使用Regex规则。 的确我想知道一个ID是否包含单词“下载”。正则表达式在Where Linq ASP.NET

测试1:

foreach (var apiData in viewReturn.Where(x => x.ID.Contains("Download"))) 
    { 
    apiExterne.Add(apiData); 
    } 

这种格式的工作

测试2:

foreach (var apiData in viewReturn.Where(x => Regex.IsMatch(x.ID, "^[dD][oO][wW][nN][lL][oO][aA][dD]$"))) 
    { 
    apiExterne.Add(apiData); 
    } 

这一个不工作。

非常感谢您的回答。

+0

又是什么“不工作”是什么意思?它找不到匹配吗?你有错误吗? – JuanR

+0

你好@Space,欢迎来到SO! “这个不起作用”是什么意思?您能否详细说明您的确切问题,并详细说明您遇到的错误?另外,您可能对[如何询问文档](https://stackoverflow.com/help/how-to-ask)感兴趣。 –

+0

您是否尝试过简化 - 其中(x => x!= nulll && Regex.IsMatch(x.ID.ToUpper(),“DOWNLOAD”))) - 如果您只想检查它是否包含单词下载 –

回答

3

^$字符添加到正则表达式的开始和结尾意味着整个字符串应该匹配,而不仅仅是一个子字符串。所以在技术上你的正则表达式不等于Contains()函数,它也会为子串匹配返回true。

从您的子字符串中删除这两个字符。你也不需要大写和小写字母,你可以使用IgnoreCase选项。

你不应该使用正则表达式来处理这样简单的场景。如果您使用正则表达式的唯一原因是您的字符串可以使用大小写的任意组合,请检查this excellent post以获取Contains()函数,该函数可以为您忽略大小写。或者,你也可以拨打ToLower()在LINQ:

foreach (var apiData in viewReturn.Where(x => x.ID.ToLower().Contains("download"))) 
2

您使用的锚,^(字符串的开始)和$(字符串的结尾),需要一个完整的字符串匹配。此外,没有必要使用列出所有字母大小写的字符类,请使用case insensitive regex flag

如果你想使用正则表达式使用

foreach (var apiData in viewReturn.Where(x => 
      Regex.IsMatch(x.ID, "download", RegexOptions.IgnoreCase))) 
{ 
    apiExterne.Add(apiData); 
} 

非正则表达式的解决方案被认为是最好的办法

foreach (var apiData in viewReturn.Where(x => 
      culture.CompareInfo.IndexOf(x, "download", CompareOptions.IgnoreCase) >= 0)) 
{ 
    apiExterne.Add(apiData); 
} 

this SO thread for details

-1

microsoft docs解释说,这是你应该做的:

System.Text.RegularExpressions.Regex searchTerm = 
     new System.Text.RegularExpressions.Regex(@"^[dD][oO][wW][nN][lL][oO][aA][dD]$"); 
var queryMatching = 
     from item in viewReturn 
     let itemID = item.ID 
     let matches = searchTerm.Matches(itemID) 
     where matches.Count > 0 
     select new 
     { 
      id = item.ID, 
      apiData = from System.Text.RegularExpressions.Match match in matches 
          select match.Value 
     };