使用正则表达式在数据表中搜索“精确单词匹配”

时间:2013-02-14 19:16:13

标签: c# .net regex datatable

根据此链接Search for “whole word match” with SQL Server LIKE pattern

我想遵循相同的查询字符串但在数据表中我写了以下语句

假设datatable包含以下记录

datatable[0]["src"]="tst";
datatable[1]["src"]="tst,";
datatable[2]["src"]="tst:";
datatable[3]["src"]="disney";

int p=datatable.AsEnumerable().Select(a => Regex.IsMatch(a["src"].ToString(), "[^a-z]windows[^a-z]")).Count();

但结果是p = 4,而这个词'windows'只存在3次

如果使用'where'而不是'select'作为以下

int p=datatable.AsEnumerable().Where(a => Regex.IsMatch(a["src"].ToString(), "[^a-z]windows[^a-z]")).Count();

p始终为0

我的陈述中有什么问题。任何建议?!

2 个答案:

答案 0 :(得分:2)

您的第一个示例(Select)对数据表中的所有行运行操作。结果将是一个布尔值列表,指示行值是否与表达式匹配。

在这两种情况下,你的模式要求在“windows”之前和之后的非alpha,这导致它不匹配。在第一种情况下,您将得到一个包含4个“假”值的列表,在第二种情况下,您什么也得不到。

我认为获得你想要的最简单的正则表达式可能是:

"\bwindows\b"

(使用Robert Harvey建议的正则表达式。这种模式声称在单词之前和之后有一个“单词中断” - 包括任何内容。)

答案 1 :(得分:0)

SelectWhere不可互换 - 您的选择将为每条记录返回truefalse值,这就是您的计数为4的原因(因为您有4条记录,因此有4条返回值。

你的where子句返回0告诉我你的RegEx与0-2的值不匹配。我会验证RegEx是否按预期工作。