在解析包含一个括号的用户输入时,不够)'s

本文关键字:不够 输入 用户 包含一 | 更新日期: 2023-09-27 18:04:48

当用户输入一个只包含一个括号的字符串时,Regex.IsMatch()中断。输入单个[也会破坏程序。

Regex.IsMatch("John Cena", "Test(", RegexOptions.IgnoreCase)

在这种情况下,John Cena是来自我的数据库的名称。然后用户在搜索输入中输入Test(,但是服务器将返回一个500错误,因为Regex.IsMatch()因为输入而中断。

我如何转义所有这些,以便我可以实际测试一个输入到数据库中的输入?我只是想测试用户的输入是否与数据库中的条目匹配。是的,来自数据库的名称可以包含圆括号,所以如果John Cena(与用户的输入匹配,如果他输入John Cena(,那就太好了。

在解析包含一个括号的用户输入时,不够)'s

正则表达式。转义将字符串中的所有regex控制字符转换为它们的转义码:

Regex.IsMatch("John Cena", Regex.Escape(userinput), RegexOptions.IgnoreCase)

但是为什么要使用正则表达式呢?在这种情况下,简单的字符串函数也会做同样的事情:

"John Cena".IndexOf(userinput, StringComparison.CurrentCultureIgnoreCase) != -1

(是保留字符,用'转义

如果你想用Regex测试你的名字,你不能转义这些字符。唯一的方法是捕获ArgumentException并正确处理它:

var result;
try
{
    result = Regex.IsMatch("John Cena", "Test(", RegexOptions.IgnoreCase)
}
catch(ArgumentException)
{
    //invalid regex -> use false or true as a constant value
    result = false;//matches nothing
}

或者,如果您不想将名称与正则表达式进行比较,您可以转义它:

Regex.IsMatch("John Cena", Regex.Escape("Test("), RegexOptions.IgnoreCase)

Regex.Escape在所有必须转义的字符前添加'
但在这种情况下,正则表达式是无用的,你可以使用更快的字符串方法:

"John Cena".IndexOf("Test(", StringComparison.CurrentCultureIgnoreCase) >= 0