4

我有以下格式的字符串:

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

我正在寻找使用正则表达式来提取第一个“blah”。为此,我将前半部分切掉,然后将后半部分切掉。

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

"prm.Add\([ ]*"

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

"prm.Add([ ]*" 

应用程序错误,因为没有右括号。

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

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

4

3 回答 3

9

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

否则编译器无法理解诸如"\n"——作者想要什么?换行符或字符串“\n”原样?

但我会尝试让它更具动态性,例如不假设存在空格字符。

于 2012-07-31T14:53:37.153 回答
4

当您在模式(它们是字符串)中转义时,您必须使用两个转义序列:

"prm.Add\\([ ]*"

这是因为如果您只使用一次转义,系统会尝试找到一个计算结果为 的字符,但该字符\(不存在 - 您肯定知道的其他字符是例如\r\n

因此,通过使用 two \,您实际上逃脱了\- 将其留在解释的模式中。然后在该模式中,您可以忽略正则表达式的含义(

于 2012-07-31T14:54:54.117 回答
0

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

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

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

prm.Add\\([ ]*

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

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

于 2012-07-31T14:57:45.130 回答