首页 > 解决方案 > C# Linq Where 和正则表达式

问题描述

我的数据库中有 4 行(示例),我将数据从数据库加载到 DataModel,例如列 Code 和 Serie 的 Regex:

Id;Code;Serie
1;XXX;XXX
2;XXX;XXX_A
3;WWW;YYY_A|YYY_B
4;CCC;XXX_A

当我使用下面的输入参数Code = XXXSerie = XXX_A的 LINQ 查询时,我得到了 2 个结果,但正确的结果只有一行 ID == 2

model = _seriesData.Where(s => (s.Code.IsMatch(code) && s.Type.IsMatch(serie)));

我不知道问题出在哪里,但是 LINQ 只能使用一个参数

在我的模型列 Code 和 Serie 是 Regex 类型

更新

对于代码行正则表达式,我也使用像这样的正则表达式 XXX_A|XXX_B|YYY_A _seriesData 变量中的数据是可以的,但结果是错误的

数据模型

public class SerieModel
{
    public Regex Type { get; set; } // name of serie
    public Regex Code { get; set; }
}

有人帮助我吗?

标签: c#regexlinq

解决方案


发生这种情况可能是因为您的正则表达式匹配substring但不是整个 string。通过将模式包装在^...$符号中来匹配整个字符串:

new Regex("XXX").IsMatch("XXX");     //true
new Regex("XXX").IsMatch("XXX_A");   //true <- heh, didn't expect that?
new Regex("^XXX$").IsMatch("XXX");   //true
new Regex("^XXX$").IsMatch("XXX_A"); //false <- this is what you want

因此,要么将列中的数据更改为:

Id;Code;Serie
1;^XXX$;^XXX$
2;^XXX$;^XXX_A$
3;^WWW$;^(YYY_A|YYY_B)$
4;^CCC$;^XXX_A$

或者在反序列化时将其更改为行:

public class SerieModel
{
    public Regex Type { get; set; } // <- put here wrapped regex.
    public Regex Code { get; set; } // <- put here wrapped regex.
}

推荐阅读