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

Posted

技术标签:

【中文标题】Regex.Escape - 抛出异常:C# 中 System.Text.RegularExpressions.dll 中的“System.ArgumentNullException”【英文标题】:Regex.Escape - Exception thrown: 'System.ArgumentNullException' in System.Text.RegularExpressions.dll in C# 【发布时间】:2021-09-22 09:23:36 【问题描述】:

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

抛出异常: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);

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

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

谢谢!

【问题讨论】:

(..): new($"/.*(query.RecipientFirstName!= null ? Regex.Escape(query.RecipientFirstName) :query.RecipientFirstName).*/i"), query.RecipientFirstName); 中包装三元运算符。请注意,字符串插值中的:表示格式规范,我们有冲突;这就是为什么我们必须包含(..) 【参考方案1】:

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

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

【讨论】:

想知道,如果有类似的东西!?? (非空归类运算符) @Kgn-web:不,我们只有?? 操作员。但是您可以尝试类似Regex.Escape(query?.RecipientFirstName ?? "") 之类的方法,它可以是转义名称或空字符串

以上是关于Regex.Escape - 抛出异常:C# 中 System.Text.RegularExpressions.dll 中的“System.ArgumentNullException”的主要内容,如果未能解决你的问题,请参考以下文章

StringToByteArray() 在 C# 2.0 中抛出异常

dll Matlab实例在c#中运行release时抛出异常

(C#) 我应该在计算中防范 Infinity/-Infinity 吗? IE。抛出溢出异常?

SQL 连接字符串在 C# 中无法识别并抛出异常

如何从 Lua 调用 C# 委托,委托可以抛出异常

何时在 C# 中重新引发异常?