regex_match无法按预期工作

时间:2013-02-02 14:46:56

标签: c++ regex

这是我的代码:

#include <iostream>
#include <string.h>
#include <regex>

using namespace std;

int main () {

    string test = "COPY" ;
    regex r1 = regex ("(COPY\b)(.*)") ; 
    if (regex_match (test,r1) ) {
        cout << "match !!" ;
    } else {
        cout << "not match !!";
    }

好的,我以为这段代码打印我“匹配!!” ,这就是我想要的。
但是,它给了我一个“不匹配!!” 我该怎么办?

通知:
我希望“COPY”匹配,但不要“COPYs”或“COPYYY”,因为我在代码中使用了“\ b”。

2 个答案:

答案 0 :(得分:2)

你需要双重转义你的\b,因为\字符是C / C ++中的“转义”序列,就像放一个换行符一样,你使用\n即使这是"(COPY\b)(.*)"一个字,而不是两个。所以你的表达式是这样的:"(COPY\\b)(.*)"到:\

对于极端情况,如果要匹配正则表达式中的"\\\\"字符,则需要:\,因为{{1}}字符也是转义字符,因此您'逃避逃跑。

仅供参考,这就是为什么在.NET中他们经常使用原始字符串语法进行正则表达式,然后你不需要转义它。其他一些语言没有这个作为转义字符,因此正则表达式更容易。

答案 1 :(得分:1)

首先,修复括号(使用if语句)。

其次尝试:

regex r1 = regex ("(COPY)(\\b|$)") ;

这将查找“ COPY ”,后跟字干或字符串的结尾。

意味着您的代码应如下所示:

#include <iostream>
#include <string.h>
#include <regex>

using namespace std ;

int main () {

    string test = "COPY" ;
    regex r1 = regex ("(COPY)(\\b|$)") ; 
    if (regex_match (test,r1) ) {
        cout << "match !!" ;
    } else {
        cout << "not match !!";
    }
}