2014-02-19 33 views
1

当我使用microsoft tr1 :: regex时,带有'}'的正则表达式会引发异常。 但同样的正则表达式可以很好地与其他正则表达式解释器一起工作。tr1 :: regex正则表达式在嵌套大括号中抛出异常

这是简化的示例代码。

string source = "{james}"; 
string exp = "{(.*)}"; 
std::tr1::cmatch res; 
std::tr1::regex rx(exp);// Throws Exception here 
while(std::tr1::regex_search(source.c_str(), res, rx)) 
{ 
    std::cout <<" "<< res[1]<<endl<<"....."<<endl; 
    source = res.suffix().str(); 
} 

相同的代码工作正常here。 我在这里错过了什么? 我试图逃避 '{',但也不能正常工作

string source = "\{james\}"; 
string exp = "\{(.*)\}"; 

我使用Visual Studio 2010中

感谢 苏尼尔

+0

你使用的是gcc吗? –

+0

应该是'string_exp =“\ {(。*)\}”'。也有些情况下,你可能必须根据你的'std :: regex'构造函数标志来避免反斜杠。还要注意,你不能有'字符串exp =字符串exp = ...'你不能在变量名中有空格。 – Brandon

+0

不同的正则表达式引擎具有不同的行为,功能集,有时甚至包含一些不同的符号,例如tr1中的{}。你必须检查什么时候在引擎之间切换,没有一般的标准。珍珠是一个准标准,但它只是带来了一些疏忽,它对发动机开发商没有规定。始终阅读与您一起工作的新引擎的文档。 –

回答

0

{}是正则表达式的元字符。他们必须逃脱。

+0

转义也不起作用。试过这样。 string source =“\ {james \}”; string exp =“\ {(。*)\}”; –

+1

不要逃避绳子。避开RegEx。 – tenub

0

在该正则表达式,你需要反斜杠转义这些括号:

\ {\}

正则表达式的容器是一个字符串,让反斜线需要成为其中的一部分串。 要在一个字符串,这是写在源代码反斜线,需要用反斜杠...逃避他们,后面"{"

所以

"\\",试试这个:

string exp = "\\{(.*)\\}"; 

如果你不得不通过一个额外的解析器来提供这个字符串,而这个解析器也是用反斜杠转义的,那么你就必须再次将反斜杠的字符串加倍。

您将需要"\\\\"来匹配反斜杠。