首页 > 解决方案 > 正则表达式不等于在 C# 字符串数组中不起作用

问题描述

我对此进行了研究,但无法弄清楚为什么?!不在我的代码中执行 Not Equal。

代码有这个:

var policyOne = "C";
var policyTwo = "GF1";
var policyThree = "018"
string policyNumber = $"^(?!{Regex.Escape(policyOne)}){Regex.Escape(policyTwo)}{Regex.Escape(policyTwo)}$",

因此,尽管我也尝试过 ?!.*,但我仍然无法识别 policyOne 不允许为“C”

所有 3 个变量在 sql linq where 子句中连接在一起

如果需要,我可以提供更多详细信息。

这是我的代码

string AnyStart = "XXXDEFGHI";
string AnythingMiddle = "ABCXXXGHI";
string AnyEnds = "ABCDEFZZZ";

List<string> Strings = new List<string>()
{
    AnythingMiddle,
    AnyStart,
    AnyEnds
};

string hcdpPlnCvgCD = "ABC";
string HcdpPmtFctrCd = "DEF";
string hccCpmtFctrCd = "GHI";



var patterns = new string[]{
                $"^(?!{Regex.Escape(hcdpPlnCvgCD)}){Regex.Escape(HcdpPmtFctrCd)}{Regex.Escape(hccCpmtFctrCd)}$",
                $"^{Regex.Escape(hcdpPlnCvgCD)}(?!.*{Regex.Escape(HcdpPmtFctrCd)}){Regex.Escape(hccCpmtFctrCd)}$",
                $"^{Regex.Escape(hcdpPlnCvgCD)}{Regex.Escape(HcdpPmtFctrCd)}(?!.*{Regex.Escape(hccCpmtFctrCd)})$",
            };
            
var wildcards = new List<string>();

foreach (var pattern in patterns)
{
    var matchResult = Strings.Where(s => Regex.IsMatch(s, pattern)).ToList();
    matchResult.Dump();
}

wildcards.Dump();

标签: c#regex

解决方案


我将建议一些事情,首先你应该分别评估 3 种不同的模式。其次,似乎一个计划背后有一些逻辑,所以我提出了一个计划类。然后您可以使用 Linq 找到您想要的计划。

public class Plan
{
    public Plan(string planCode)
    {
        PlanCode = planCode;
        Evaluate();
    }
    
    private const string _planCoverage= "^ABC";
    private const string _planPaymentFactor= "DEF";
    private const string _planCoPaymentFactor = "GHI$";
    
    public string PlanCode { get; set; }
    public bool IsCoverage { get; set; }
    public bool IsPayment { get; set; }
    public bool IsCoPay { get; set; }
        
    private void Evaluate()
    {
        IsCoverage = Regex.IsMatch(PlanCode, _planCoverage);
        IsPayment = Regex.IsMatch(PlanCode, _planPaymentFactor);
        IsCoPay = Regex.IsMatch(PlanCode, _planCoPaymentFactor);
    }
}

使用此类,以下代码应完成您要执行的操作

string anyStart = "XXXDEFGHI";
string anyMiddle = "ABCXXXGHI";
string anyEnd = "ABCDEFZZZ";

List<Plan> plans = new List<Plan>(){
    new Plan(anyStart),
    new Plan(anyMiddle),
    new Plan(anyEnd)
};
        
//what your first regex tried to accomplish
List<string>  noCoveragePlans = plans
    .Where(plan => !plan.IsCoverage && plan.IsPayment && plan.IsCoPay)
    .Select(plan => plan.PlanCode)
    .ToList();

//what your second regex tried to accomplish
List<string> noPaymentPlans = plans
    .Where(plan => plan.IsCoverage && !plan.IsPayment && plan.IsCoPay)
    .Select(plan => plan.PlanCode)
    .ToList();

//what your third regex tried to accomplish
List<string> noCoPayPlans = plans
    .Where(plan => plan.IsCoverage && plan.IsPayment && !plan.IsCoPay)
    .Select(plan => plan.PlanCode)
    .ToList();

推荐阅读