Regex.Escape - 抛出异常:C# 中 System.Text.RegularExpressions.dll 中的“System.ArgumentNullException”

问题描述

我有正则表达式来匹配输入字符串,但是当输入字符串为空时,我得到以下错误

抛出异常:System.Text.RegularExpressions.dll 中的“System.ArgumentNullException”

这就是我的方法的样子

public async Task<PagedResult<Transaction>> Find(FindTransactionQuery query,CancellationToken cancellationToken)
{
            
    var recipientFirstNameFilter = 
BuildFilterDeFinition(Builders<Transaction>.Filter.Regex(_ => _.Recipient.FirstName,new($"/.*{ Regex.Escape(query.RecipientFirstName)}.*/i")),query.RecipientFirstName);

    var senderFirstNameFilter = 
BuildFilterDeFinition(Builders<Transaction>.Filter.Regex(_ => _.Sender.FirstName,new($"/.*{Regex.Escape(query.SenderFirstName)}.*/i")),query.SenderFirstName);

    //& so on
}

    private static FilterDeFinition<Transaction> BuildFilterDeFinition(FilterDeFinition<Transaction> transactionFilter,string searchText) =>
        string.IsNullOrWhiteSpace(searchText)
                ? Builders<Transaction>.Filter.Empty
                : transactionFilter;

我尝试使用以下条件运算符,但不允许:

    var recipientFirstNameFilter = BuildFilterDeFinition(Builders<Transaction>.Filter.Regex(_ => _.Recipient.FirstName,//here
    new($"/.*{query.RecipientFirstName!= null ? Regex.Escape(query.RecipientFirstName) :query.RecipientFirstName}.*/i")),query.RecipientFirstName);

是的,一种解决方案是再添加一个变量 *& 检查空值,但为此引入一个额外的变量并没有多大吸引力。

有没有我可以做的类似的事情!?? (非空)然后构建正则表达式?

谢谢!

解决方法

当使用字符串插值时,:表示格式

// Here we want 4 digits after decimal point
string demo = $"{Math.PI:f4}";

这就是为什么字符串插值中的裸三元运算符不能编译

// Compile time error
string demo = $"{Math.PI > 3 ? 'T' : 'F'}";

.Net 抱怨格式错误(此处为 'F')规范。解决方案是使用 (...)

// Now it's correct
string demo = $"{(Math.PI > 3 ? 'T' : 'F')}";

就你而言

new($"/.*{(query.RecipientFirstName!= null ? Regex.Escape(query.RecipientFirstName) : "")}.*/i")),query.RecipientFirstName);

或(如果我们在 null 的帮助下检查 Regex.Escape 内的 ??):

new($"/.*{Regex.Escape(query?.RecipientFirstName ?? "")}.*/i")),query.RecipientFirstName);