Regex.Escape - 抛出的异常:'System.ArgumentNullException' in System.Text.RegularExpressions.dll in C#

Regex.Escape - Exception thrown: 'System.ArgumentNullException' in System.Text.RegularExpressions.dll in C#

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

Exception thrown: 'System.ArgumentNullException' in System.Text.RegularExpressions.dll

我的方法是这样的

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);

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

有什么类似的我可以做的吗!?? (Not Null) & 然后构建 Regex?

谢谢!

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

// 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);

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

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