对于正则表达式, 我以前是写javascript脚本的, 对JS的正则很熟悉.目前写boost的正则的时候, 不清楚它和js的正则区别到底在哪里, 所以有时候莫名的错误很多.如:
"^(?:http|https|ftp)://.+/(?:.+\\.pkg)(?:\\?[^/\\]*)?$"一直报错: std::runtime_error = {_Str="Unmatched [ or [^" }我把^ $起始限定符删掉, 一定是这样错误, 不知道boost有没有g模式, i = ignorecase, g = global(和用了^...$一样)请问大家知道哪里有boost正则和其它(如脚本JS)的正则的区别吗?

解决方案 »

  1.   

    js和boost.regex的语法不太一样,仔细看看http://www.boost.org/doc/libs/1_35_0/libs/regex/doc/html/boost_regex/syntax.html
      

  2.   

    我看了上面的网址, 说的内容除了[[:lower:]]内在的名称之外, 基本相同, 至少我写的这些是相同的, 所以不知道问题是不是出在我的代码上, 我的代码如下:UINT const GetImageIndex(wchar_t *url)
    {
    // return value:
    //      0 = url, 1 = ps, 2 = txt UINT rtn = 0;
    try
    {
    wregex exp1(_T("^(?:http|https|ftp)://.+/(?:.+\\.pkg)(?:\\?[^/\\]*)?$"),boost::regex::perl|boost::regex::icase);
    wregex exp2(_T("^(?:http|https|ftp)://.+/(?:.+\\.txt)(?:\\?[^/\\]*)?$"),boost::regex::perl|boost::regex::icase);

    if(regex_match(url,exp1))rtn = 1;
    else if(regex_match(url,exp2))rtn = 2;
    }
    catch(regex_error &ex)
    {
    printf(ex.what());
    }
    return rtn;
    }
    请帮我看一下上面的代码有什么问题吗? 感觉好像是_T("")宽字符引起的?? 
      

  3.   


    不好意思, 大家, 是我的代码的问题, 正则是没有问题的.问题在于我没仔细看regex_error的内容.它报的错在:
    Unmatched [ or [^
    列:46呵呵,  一直以为"^(?:http¦https ¦ftp)://.+/(?:.+\\.pkg)(?:\\?[^/\\]*)?$" 
    是第一个^有问题, 原来是后面的[^/\\]的问题. \\不就是\吗? 没想到一个\把]也注释了,所以就不匹配了.改成[^\\/] 就是: "^(?:http¦https ¦ftp)://.+/(?:.+\\.pkg)(?:\\?[^\\/]*)?$" 就可以了. OK, 结帖.