根据此链接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
我的陈述中有什么问题。任何建议?!
答案 0 :(得分:2)
您的第一个示例(Select
)对数据表中的所有行运行操作。结果将是一个布尔值列表,指示行值是否与表达式匹配。
在这两种情况下,你的模式要求在“windows”之前和之后的非alpha,这导致它不匹配。在第一种情况下,您将得到一个包含4个“假”值的列表,在第二种情况下,您什么也得不到。
我认为获得你想要的最简单的正则表达式可能是:
"\bwindows\b"
(使用Robert Harvey建议的正则表达式。这种模式声称在单词之前和之后有一个“单词中断” - 包括任何内容。)
答案 1 :(得分:0)
Select
和Where
不可互换 - 您的选择将为每条记录返回true
或false
值,这就是您的计数为4的原因(因为您有4条记录,因此有4条返回值。
你的where子句返回0告诉我你的RegEx与0-2的值不匹配。我会验证RegEx是否按预期工作。