如何逃避RegEx?

时间:2012-05-02 16:38:37

标签: c# regex

我有一个正则表达式,我现在需要进入C#。我收到这样的错误

Unrecognized escape sequence    

我正在使用Regex.Escape - 但显然不正确。

string pattern = Regex.Escape("^.*(?=.{7,})(?=.*[a-zA-Z])(?=.*(\d|[!@#$%\?\(\)\*\&\^\-\+\=_])).*$");
hiddenRegex.Attributes.Add("value", pattern);

这是如何正确完成的?

2 个答案:

答案 0 :(得分:4)

你得到的错误是在编译时正确的吗?这意味着C#编译器无法理解您的字符串。在字符串前面加上@符号,你应该没问题。你不需要Regex.Escape。

请参阅What's the @ in front of a string in C#?

var pattern = new Regex(@"^.*(?=.{7,})(?=.*[a-zA-Z])(?=.*(\d|[!@#$%\?\(\)\*\&\^\-\+\=_])).*$");
pattern.IsMatch("Your input string to test the pattern against");

答案 1 :(得分:0)

您获得的错误是由于您的字符串包含无效的转义序列(例如\d)。要解决此问题,请手动转义反斜杠或改为编写verbatim string literal

string pattern = @"^.*(?=.{7,})(?=.*[a-zA-Z])(?=.*(\d|[!@#$%\?\(\)\*\&\^\-\+\=_])).*$";
当您想要将动态内容嵌入正则表达式时,将使用

Regex.Escape,而不是在您想构建固定正则表达式时。例如,您可以在此处使用它:

string name = "this comes from user input";
string pattern = string.Format("^{0}$", Regex.Escape(name));

这样做是因为name很可能包含正则表达式中具有特殊含义的字符,例如点或圆括号。当name被硬编码时(如您的示例所示),您可以手动转义这些字符。