我有一个以下格式的字符串:
prm.Add( "blah", "blah" );
我希望使用正则表达式来提取第一个“等等”。 要做到这一点,我正在雕刻前半部分,然后雕刻后半部分。
正在使用的正则表达式摆脱“prm.Add(”是:
"prm.Add\([ ]*"
其他线程似乎表明在paranthesis之前转义字符是可以接受的。然而VS抱怨我有一个无效的转义字符序列“(”。 如果我使用:
"prm.Add([ ]*"
应用程序错误,因为没有关闭的paranthesis。
我意识到我可以通过在“prm.Add(”上使用Regex.Escape来解决这个问题。但这不是很优雅。
我的正则表达式语法是否错误或者VS2010不接受括号的转义?
答案 0 :(得分:6)
您只需要转义反斜杠以便编译器理解:"prm.Add\\([ ]*"
或@"prm.Add\([ ]*"
否则编译器无法理解"\n"
之类的内容 - 作者想要什么?换行符或字符串“\ n”原样是什么?
但我会尝试让它更有活力,例如不假设有空格字符。
答案 1 :(得分:3)
当您以模式(字符串)转义时,必须使用两个转义序列:
"prm.Add\\([ ]*"
这是因为如果你只使用一个转义符,系统会尝试找到一个不存在的评估为\(
的字符 - 你肯定知道的其他字符是例如\r
或\n
。
因此,通过使用两个\
,您实际上逃脱了\
- 将其留在解释的模式中。然后在那个模式中,你会想到(
答案 2 :(得分:0)
这里的问题是,当在IDE中转义字符串时,您正在转义某些内容,以便编译器理解转义。你想要的是REGEX对象理解你的字符串。
您需要使用正则表达式对象获取prm.Add\([ ]*
。
但是,反向间隙(\
)是一个转义字符,所以编译器会尝试转义“(”,他不知道如何。所以...你需要逃避反弹本身:
prm.Add\\([ ]*
编译器处理此字符串并将\\
转换为\
。这导致你想要什么,因为正则表达式现在将获得由prm.Add\([ ]*
形成的字符串。
理解这一点的一种方法是,如果您正在从文件或用户输入读取正则表达式,则只需要一次反弹,因为编译器不再处理它(该字符串是在运行中获取的 - 时间而不是硬编码时的编译时间。)