如何在LINQ查询中比较Regex的字符串?

时间:2015-02-12 20:37:06

标签: regex linq c#-4.0

我有两个数据表dtRosterList和falsefields 我想列出所有针对假域的列表,其中列列值是一个句子“你好我是一个字段列表”和假字段列值有一个字符串“字段”...我匹配Regex.IsMatch

Regex.IsMatch(r.Field<string>("ListName"),@"\bFacebook Link\b") 

在Visual Studio中间窗口中返回true但是 在Linq查询本身中,Regex.IsMatch(r.Field(“ListName”),@“\ b”+ fn +“\ b”)出现错误,我没有得到任何行......查询如下:

   var listTobeDeleted = dtRosterList.AsEnumerable().
                             Where(r => falsefields.AsEnumerable()
                                 .Select(f => f.Field<string>("FieldName")).Any(fn => Regex.Match(r.Field<string>("ListName"),@"\b"+fn+"\b",RegexOptions.IgnoreCase))).CopyToDataTable();

1 个答案:

答案 0 :(得分:2)

您的代码有两个问题:

  • 您已使用Regex.Match代替Regex.IsMatch;
  • 您错过了第二个@字符串上的"\b" verbatim string literal前缀;
    • 使用前缀,该字符串包含两个字符:\ (ASCII代码92)b (ASCII代码98)。正则表达式引擎将此解释为&#34;匹配必须发生在字母数字和非字母数字字符之间的边界上。
    • 如果没有前缀,则字符串包含单个字符:backspace (ASCII代码8)。 Regex引擎将其解释为文字字符,因此只匹配包含退格字符的字符串。

我还倾向于在单词周围添加a Regex.Escape call以查找,以防它包含任何特殊字符。

var listTobeDeleted = dtRosterList.AsEnumerable()
    .Where(r => falsefields.AsEnumerable()
    .Select(f => f.Field<string>("FieldName"))
    .Any(fn => Regex.IsMatch(r.Field<string>("ListName"), @"\b" + Regex.Escape(fn) + @"\b", RegexOptions.IgnoreCase)))
    .CopyToDataTable();