C# 分析包含一个括号的用户输入时,没有足够的“”

C# 分析包含一个括号的用户输入时,没有足够的“”,c#,C#,当用户输入仅包含一个括号的字符串时,Regex.IsMatch将中断。输入一个[1]也会中断程序 Regex.IsMatch("John Cena", "Test(", RegexOptions.IgnoreCase) 在本例中,John Cena是我数据库中的名称。然后用户在搜索输入中输入Test,但服务器将返回500错误,因为Regex.IsMatch因输入而中断 如何对所有这些进行转义,以便我可以实际测试数据库中的输入。我只想测试用户的输入是否与数据库中的输入匹配。是的,数据库中的名称可

当用户输入仅包含一个括号的字符串时,Regex.IsMatch将中断。输入一个[1]也会中断程序

Regex.IsMatch("John Cena", "Test(", RegexOptions.IgnoreCase)
在本例中,John Cena是我数据库中的名称。然后用户在搜索输入中输入Test,但服务器将返回500错误,因为Regex.IsMatch因输入而中断

如何对所有这些进行转义,以便我可以实际测试数据库中的输入。我只想测试用户的输入是否与数据库中的输入匹配。是的,数据库中的名称可以包含一个括号,因此如果John Cena键入John Cena,则如果John Cena与用户的输入匹配就更好了。

是保留的char,使用\

Regex对其进行转义。转义将字符串中的所有Regex控制字符转换为其转义码:

Regex.IsMatch("John Cena", Regex.Escape(userinput), RegexOptions.IgnoreCase)
但是为什么要使用正则表达式呢?在这种情况下,简单的字符串函数也会这样做:

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

如果要使用正则表达式测试名称,则无法转义这些字符。唯一的方法是捕获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

所以我基本上必须逃逸每一个角色?这似乎不是一个好的解决办法。逃逸,[,],等等。您可以搜索特殊字符并执行替换。请参阅此处,您可以使用Regex.Escape too。如果您需要搜索字符串(如John Cena)并处理用户输入,则可能Regex不是合适的工具。int index=input.IndexOfJohn Cena,StringComparison.CurrentCultureIgnoreCase将在这种场景下工作,允许用户创建常规的ex后端的压力可能是拒绝服务攻击的一个向量:@MartinLiversage所以更喜欢IndexOf,即使我现在逃逸了输入?@snorax:如果你逃逸了输入,那么就不可能发生拒绝服务攻击,但我不确定regex是否是正确的工具。在你的情况下,regex将是一个简单的子脚本ng搜索。@MartinLiversage是的,这是真的。是的,这是我需要的。我不知道正则表达式。Escape只会帮我逃过它们。非常有效!谢谢。