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”是一个单词边界。