在解析包含一个括号的用户输入时,不够)'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(
,那就太好了。
正则表达式。转义将字符串中的所有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