在VC ++中使用正则表达式

时间:2010-02-25 10:46:09

标签: regex visual-c++

我在mu项目中找到Email ids,我正在使用一些正则表达式预处理输入。

RegExpPhone6.RegComp("[\[\{\(][ -]?[s][h][i][f][t][ -]?[+-][2][ -]?[\]\}\)]");  

在我编译的时候,我正在收到警告信息,如

Warning 39  warning C4129: ')' : unrecognized character escape sequence 

我该如何解决这个问题? 为什么会发生这种情况?它会影响到哪里? 请帮助我...

4 个答案:

答案 0 :(得分:2)

我不确定您使用的是哪种正则表达式引擎,但根据错误,

)无法识别转义,所以它似乎抱怨你在做\)

大多数情况() {} [][(){}]只需要[s][h][i][f][t]就可以了。

shiftRegExpPhone6.RegComp("[\[{(][ -]?shift[ -]?[+-][2][ -]?[\]})]");

相同

所以,就像这样

\

并且

如果仍然无效,请尝试将\\更改为{{1}},有时需要转义反斜杠。

答案 1 :(得分:2)

C ++编译器会将字符串文字中的某些转义序列转换为备用值。其中最着名的可能是\ n,它会转换为换行符。在这种情况下,编译器抱怨,因为\)不是标准的转义序列集之一(其中可以找到here的列表)。由于您希望正则表达式本身包含反斜杠,因此您可能希望使用\\,这是转换为单个\的转义序列。像这样:

RegExpPhone6.RegComp("[\\[\\{\\(][ -]?[s][h][i][f][t][ -]?[+-][2][ -]?[\\]\\}\\)]");

答案 2 :(得分:1)

您已在角色类中转义了需要(且不应该)转义的角色,尤其是()[]{}

在你的情况下

RegExpPhone6.RegComp("[{([][ -]?shift[ -]?[+-][2][ -]?[]})]");

应该做得很好。

请注意,字符类中字符的顺序对此起作用很重要。

[][(){}]将匹配所有大括号/ parens /括号。但它可能会让人们失望(“这是一个空的角色类?”),所以在这种情况下,转移括号可能是一个更好的主意:

RegExpPhone6.RegComp("[{(\[][ -]?shift[ -]?[+-][2][ -]?[\]})]");

另见Jan Goyvaerts' blog关于这可能成为问题的原因和地点。

答案 3 :(得分:0)

你确定你没有在字符串中使用双引号吗?

使用二进制搜索解决问题。摆脱一半的角色,看看它是否编译。 如果它确实编译,则重复另一半。然后重复使用非编译字符串的一半,直到找到导致问题的字符。然后使用反斜杠将其转义。

E.g。如果你想在字符串中使用双引号,你必须写这个:

"My name is \"Pat\""