C++ 正则表达式匹配未按预期工作

C++ 正则表达式匹配未按预期工作,c++,regex,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 << "matc

这是我的代码:

#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 !!";
    }
#包括
#包括
#包括
使用名称空间std;
int main(){
string test=“复制”;
regex r1=regex(((COPY\b)(.*));
if(正则表达式匹配(测试,r1)){

cout首先,固定括号(使用
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 !!";
    }
}
#包括
#包括
#包括
使用名称空间std;
int main(){
string test=“复制”;
regex r1=regex(“(副本)(\\b |$)”;
if(正则表达式匹配(测试,r1)){

cout首先,固定括号(使用
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 !!";
    }
}
#包括
#包括
#包括
使用名称空间std;
int main(){
string test=“复制”;
regex r1=regex(“(副本)(\\b |$)”;
if(正则表达式匹配(测试,r1)){

您需要双重转义
\b
,因为
\
字符是C/C++中的“转义”序列,就像在换行时,您使用
\n
,即使这是一个字符,而不是两个。因此您的表达式从:
(复制\b)(.*)
到:
(复制\\b)(.*)”

对于极端情况,如果要匹配正则表达式中的
\
字符,则需要这样:
“\\\\\”
,因为
\
字符也是转义字符,因此您正在转义


仅供参考,这就是为什么在.NET中,他们经常对正则表达式使用原始字符串语法,那么您就不需要对其进行转义。其他一些语言没有转义字符,因此正则表达式更简单。

您需要对
\b
进行双重转义,因为
\
字符就是“转义符”C/C++中的序列,就像在换行时一样,使用
\n
,即使这是一个字符,而不是两个字符。因此您的表达式从:
“(复制\b)(.*)”
到:
“(复制\\b)(.*)”

对于极端情况,如果要匹配正则表达式中的
\
字符,则需要这样:
“\\\\\”
,因为
\
字符也是转义字符,因此您正在转义


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

AFAIK在
C++
\b
中是一个单词边界……我们在这里讨论
C++
,而单词边界是这正是他想要的。@OFIRFARCY:不,您混淆了正则表达式语法中的
\b
单词边界和字符串中的
\b
转义序列(此转义序列在C或C++中是相同的)您提供的字符串为代码> ReXEX < /C>构造函数,因此需要避免代码> > /CUT>,这样ReGeX构造函数接收代码> > B b/COD>而不是退格字符。在C++中,字符<代码> \b′/COD>是一个回退空间。在正则表达式中,字符串<代码> \\b”< /> >(或R \ \ B)“如果您有C++ 11”是一个单词边界。
C++
中的AFAIK,
\b
是一个单词边界…我们在这里讨论的是
C++
;而单词边界正是他想要的。@OfirFarchy:不,你混淆了正则表达式语法中的
\b
单词边界和字符串中的
\b
转义序列(这个转义序列在C或C++中是相同的)您提供的字符串为代码> ReXEX < /C>构造函数,因此需要避免代码> > /CUT>,这样ReGeX构造函数接收代码> > B B/COM>而不是退格字符。在C++中,字符<代码> \b′/COD>是一个回退空间。在正则表达式中,字符串<代码> \\b \ < /C> >(或R \ \ b)“如果您有C++ 11”是一个单词边界。