Escape Left Bracket C#Regex

时间:2012-07-31 14:50:48

标签: c# regex visual-studio-2010 escaping

我有一个以下格式的字符串:

prm.Add( "blah", "blah" ); 

我希望使用正则表达式来提取第一个“等等”。 要做到这一点,我正在雕刻前半部分,然后雕刻后半部分。

正在使用的正则表达式摆脱“prm.Add(”是:

"prm.Add\([ ]*"

其他线程似乎表明在paranthesis之前转义字符是可以接受的。然而VS抱怨我有一个无效的转义字符序列“(”。 如果我使用:

"prm.Add([ ]*" 

应用程序错误,因为没有关闭的paranthesis。

我意识到我可以通过在“prm.Add(”上使用Regex.Escape来解决这个问题。但这不是很优雅。

我的正则表达式语法是否错误或者VS2010不接受括号的转义?

3 个答案:

答案 0 :(得分:6)

您只需要转义反斜杠以便编译器理解:"prm.Add\\([ ]*"@"prm.Add\([ ]*"

否则编译器无法理解"\n"之类的内容 - 作者想要什么?换行符或字符串“\ n”原样是什么?

但我会尝试让它更有活力,例如不假设有空格字符。

答案 1 :(得分:3)

当您以模式(字符串)转义时,必须使用两个转义序列:

"prm.Add\\([ ]*"

这是因为如果你只使用一个转义符,系统会尝试找到一个不存在的评估为\(的字符 - 你肯定知道的其他字符是例如\r\n

因此,通过使用两个\,您实际上逃脱了\ - 将其留在解释的模式中。然后在那个模式中,你会想到(

的正则表达式意义

答案 2 :(得分:0)

这里的问题是,当在IDE中转义字符串时,您正在转义某些内容,以便编译器理解转义。你想要的是REGEX对象理解你的字符串。

您需要使用正则表达式对象获取prm.Add\([ ]*

但是,反向间隙(\)是一个转义字符,所以编译器会尝试转义“(”,他不知道如何。所以...你需要逃避反弹本身:

prm.Add\\([ ]*

编译器处理此字符串并将\\转换为\。这导致你想要什么,因为正则表达式现在将获得由prm.Add\([ ]*形成的字符串。

理解这一点的一种方法是,如果您正在从文件或用户输入读取正则表达式,则只需要一次反弹,因为编译器不再处理它(该字符串是在运行中获取的 - 时间而不是硬编码时的编译时间。)