主要代码如下:int main(int argc, char* argv[])
{
char str1[MAX_PATH] = {0};
::strcpy(str1, "select\\b\\s[a-z]*\\s\\bfrom\\b\\s\\w+");
regex   expression(str1);        std::string in;
        cmatch what;
while(true)
{
char szIn[MAX_PATH*2] = {0}; ::strcpy(szIn, "aaaselect b from aaa");
if(regex_match(szIn, what, expression))
{
for(int i=0;i<what.size();i++)
cout<<"str :"<<what[i].str()<<endl;
}
else
{
cout<<"Error Input"<<endl;
}
break;
}
   return 0;
}如上代码,如果szIn的值为"aaaselect b from aaa",得到的结果是匹配失败,即输出"Error Input"
可是如果szIn的值为"select b from aaa",就能匹配成功。我的问题是:如果正则式前面没有加^,应该是表示匹配的字符串可以在任何位置吧(而不一定要在开始位置).但,为什么上面的例子,szIn中的字符串也必须开始就是select,才能匹配成功?而前面有任何其它字符(aaa)就匹配失败呢?是不是应该还做什么设置?谢谢~

解决方案 »

  1.   

    正则表达式:select\b\s[a-z]*\s\bfrom\b\s\w+
    测试字符串:aaaselect b from aaa匹配结果:select b from aaa用地是微软的正则接口。
      

  2.   

    可我用的是boost库的啊。我发现如果如果正则表达式为.*select\b\s[a-z]*\s\bfrom\b\s\w+就可以匹配select b from aaa可是为什么前面要加入.*呢?
    按理说,默认情况下,不写前面不写^就可以了啊??
      

  3.   

    楼上能不能提供点编译boost库的资料啊,我现在遇到点问题,编译只好没有dll文件和lib文件产生
    http://community.csdn.net/Expert/TopicView3.asp?id=4919766
      

  4.   

    REGEX的语法和标准的语法有些不同
      

  5.   

    在 select 前再加一个 \b:
    \bselect\b....推荐搂主一篇文章:
    http://www.regexlab.com/zh/regref.htm另外:注意区分 boost 的 regex_match() 和 regex_search():
    regex_match() 要求必须是开头位置
      

  6.   

    sswater(光杆兵) ( ) 信誉:100 非常感谢你的回答,如果用regex_search(),就可以匹配成功了。如果按一般正则表达式的语法来讲,即前面不加^时,可以不必是开头位置,那么在boost中,应该是用regex_search()而不是regex_match()?这两者,只有位置是否是开始位置,这样的差别吗?谢谢
      

  7.   

    boost 文档 http://www.boost.org/libs/regex/doc/regex_match.html 上的原话是:
    "matches all of a given character sequence"因此,regex_match() 不光是要求开头位置,而且要求刚好匹配到字符串结束位置。事实上,regex_match()操作 应该是 regex_search() 操作中的其中一步。换句话说,regex_search() 执行了多次 regex_match() 操作,相当于 compare 与 find 操作的关系。