2010-03-02 64 views
1

我遇到了tr1 :: regex(VS2008)的一个非常奇怪的问题,我找不出原因。为什么这个正则表达式模式(tr1 :: regex)异常?

微软C++异常::在执行期间到达第四正则表达式定义当在柱的端部的代码编译很好,但会引发异常的std :: TR1在存储器位置0x0012f5f4 :: regex_error ..

但是,我能看到的唯一区别(也许我是盲人)在第三和第四个之间是'NumberOfComponents'而不是'SchemeVersion'。起初我想也许两个(第三和第四)都是错误的,第三个错误只是在第四个触发。这似乎并非如此,因为我移动了它们并在它们之间放置了多个其他正则表达式定义。有问题的行总是触发异常。

没有人有任何想法,为什么这条线

std::tr1::regex rxNumberOfComponents("\\NumberOfComponents:(\\s*\\d+){1}");

触发异常,但

std::tr1::regex rxSchemeVersion("\\SchemeVersion:(\\s*\\d+){1}");

不?运行时是否只是搞乱了我?

感谢您阅读本文并感谢您的宝贵意见。
牛逼

PS:我是完全确定的解决方案是很容易我打我的头靠在最近的墙壁,甚至出了“愚蠢的问题”因果报应......


#include <regex> 

int main(void) 
{ 
    std::tr1::regex rxSepFileIdent("Scanner Separation Configuration"); 
    std::tr1::regex rxScannerNameIdent("\\ScannerName:((\\s*\\w+)+)"); 

    std::tr1::regex rxSchemeVersion("\\SchemeVersion:(\\s*\\d+){1}"); 
    std::tr1::regex rxNumberOfComponents("\\NumberOfComponents:(\\s*\\d+){1}"); 

    std::tr1::regex rxConfigStartIdent("Configuration Start"); 
    std::tr1::regex rxConfigEndIdent("Configuration End"); 

    return 0; 
} 
+0

如果将rxSchemeVersion行更改为“NumberOfComponents”,会发生什么情况? – 2010-03-02 02:41:49

+0

'std :: tr1 :: regex_error'是相当通用的。什么是错误代码(捕获异常为(例如)'rerr'并打印'rerr.code()')?将结果与'std :: tr1 :: regex_constants :: error_type'常量(http://msdn.microsoft.com/en-us/library/bb982845(lightweight).aspx)进行比较以找出错误(s)你正在处理。 – outis 2010-03-02 02:42:39

回答

2

您需要双重逃避你的反斜杠 - 一次为正则表达式本身,第二次为他们的字符串。

以S开头的那个工作,因为\S是一个有效的正则表达式转义(非空白字符)。以N开头的那个不会(因为\N不是有效的正则表达式转义)。使用"\\\\SchemeVersion:等等。

+0

感谢大家的快速回复(特别是Dav和Vlad)... 我要继续前进,并在我的小卧室里留下一个凹痕,以便问......:D – Tobias 2010-03-02 02:50:20

相关问题