转义左括号 C# 正则表达式

4

I have a string in the following format:

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

我希望使用正则表达式提取第一个“blah”。 为了做到这一点,我将前半部分和后半部分切割开来。

我使用的正则表达式是用来去掉“prm.Add(”的:

"prm.Add\([ ]*"

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

"prm.Add([ ]*" 

应用程序出现错误,因为没有闭合括号。
我意识到可以通过在"prm.Add("上使用Regex.Escape来解决这个问题。但这并不是非常优雅的方法。
我的正则表达式语法有误还是VS2010不接受括号的转义字符?

2
顺便提一下 - 你需要转义 .,除非你想匹配该位置的任何字符。 - Damien_The_Unbeliever
你能确认一下你是想在Visual Studio IDE中使用这个正则表达式进行搜索,还是作为代码中的RegEx类的一部分吗? - freefaller
3个回答

9

您只需对反斜杠进行转义,以使编译器理解:"prm.Add\\([ ]*"@"prm.Add\([ ]*"

否则,编译器无法理解类似于"\n"这样的字符 - 作者想要什么?换行还是原封不动地作为字符串"\n"?

但是我建议让它更具动态性,例如不假设存在空格字符。


做到了,非常感谢!另外,我认为 * 的标准用法意味着 0 或更多,所以即使不存在空格也会将其去除? - Fraser Connor
是的,但是甚至有一个专门用于空格的特殊字符类:\s,它将匹配任何空格(空格、制表符等)。 - Mario

4

当你在模式中使用转义字符(字符串),你需要使用两个转义序列:

"prm.Add\\([ ]*"

这是因为如果只使用一个转义符,系统会尝试寻找一个被评估为\(的字符,但这种字符不存在。你肯定知道其他一些字符,比如\r或者\n。所以,通过使用两个\,你实际上是对\进行了转义,将其保留在被解释的模式中。然后,在该模式内部,你可以转义正则表达式中的(

0

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

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

然而,反斜杠(\)是一个转义字符,因此编译器将尝试转义“(”,但它不知道如何转义。所以...您需要转义反斜杠本身:

prm.Add\\([ ]*

编译器会处理这个字符串并将\\转换为\,这正是您想要的,因为Regex现在会得到一个由prm.Add\([ ]*组成的字符串。
理解这一点的一种方式是,如果您从文件或用户输入中读取Regex,则只需要一个反斜杠,因为编译器不再处理它(该字符串在运行时获取,而不是在硬编码时在编译时获取)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接