学习基础后c++ /questions/tagged/c%2b%2b规则,我专注于std::regex
,创建两个控制台应用程序: 1.renrem
and 2.bfind
.
我决定创建一些方便的函数来处理regex
in c++ /questions/tagged/c%2b%2b尽可能简单加上所有std
;命名RFC(=正则表达式函数集合)
有几件奇怪的事情总是让我感到惊讶,但这一件毁了我所有的尝试和那两个控制台应用程序。
其中重要的功能之一是count_match
计算字符串内匹配的数量。这是完整的代码:
unsigned int count_match( const std::string& user_string, const std::string& user_pattern, const std::string& flags = "o" ){
const bool flags_has_i = flags.find( "i" ) < flags.size();
const bool flags_has_g = flags.find( "g" ) < flags.size();
std::regex::flag_type regex_flag = flags_has_i ? std::regex_constants::icase : std::regex_constants::ECMAScript;
// std::regex_constants::match_flag_type search_flag = flags_has_g ? std::regex_constants::match_default : std::regex_constants::format_first_only;
std::regex rx( user_pattern, regex_flag );
std::match_results< std::string::const_iterator > mr;
unsigned int counter = 0;
std::string temp = user_string;
while( std::regex_search( temp, mr, rx ) ){
temp = mr.suffix().str();
++counter;
}
if( flags_has_g ){
return counter;
} else {
if( counter >= 1 ) return 1;
else return 0;
}
}
首先,如您所见,该行search_flag
被评论是因为它被忽略了std::regex_search
and 我不知道为什么?因为——确切的标志被接受std::regex_repalce
. So std::regex_search
忽略format_first_only
but std::regex_replace
接受它。就这样吧。
主要问题在于icase
当模式为字符类 -> []
。事实上,当模式只是capital letter
or small letter
: [A-Z]
or [a-z]
假设这个字符串 s ="ONE TWO THREE four five six seven"
的输出c++ /questions/tagged/c%2b%2b std
std::cout << count_match( s, "[A-Z]+" ) << '\n'; // 1 => First match
std::cout << count_match( s, "[A-Z]+", "g" ) << '\n'; // 3 => Global match
std::cout << count_match( s, "[A-Z]+", "gi" ) << '\n'; // 3 => Global match plus insensitive
而对于确切的perl /questions/tagged/perl and d /questions/tagged/d语言和c++ /questions/tagged/c%2b%2b with boost
输出是:
std::cout << count_match( s, "[A-Z]+" ) << '\n'; // 1 => First match
std::cout << count_match( s, "[A-Z]+", "g" ) << '\n'; // 3 => Global match
std::cout << count_match( s, "[A-Z]+", "gi" ) << '\n'; // 7 => Global match plus insensitive
我了解正则表达式的风格PCRE; or ECMAScript 262c++ 使用它,但我没有 ides为什么 c++ 唯一的搜索功能会忽略一个简单的标志? Since std::regex_iterator
and std::regex_token_iterator
也在内部使用此功能。
很快,我就无法使用这两个我的应用程序和 RFCstd
图书馆因为如果这个!
因此,如果有人知道根据哪条规则,这可能是有效的粗鲁行为ECMAScript 262
或者如果我有什么地方错了请告诉我。谢谢。
测试过
gcc version 6.3.0 20170519 (Ubuntu/Linaro 6.3.0-18ubuntu2~16.04)
clang version 3.8.0-2ubuntu4
perl /questions/tagged/perl code:
perl -le '++$c while $ARGV[0] =~ m/[A-Z]+/g; print $c ;' "ONE TWO THREE four five six seven" // 3
perl -le '++$c while $ARGV[0] =~ m/[A-Z]+/gi; print $c ;' "ONE TWO THREE four five six seven" // 7
d /questions/tagged/d code:
uint count_match( ref const (char[]) user_string, const (char[]) user_pattern, const (char[]) flags ){
const bool flag_has_g = flags.indexOf( "g" ) != -1;
Regex!( char ) rx = regex( user_pattern, flags );
uint counter = 0;
foreach( mr; matchAll( user_string, rx ) ){
++counter;
}
if( flag_has_g ){
return counter;
} else {
if( counter >= 1 ) return 1;
else return 0;
}
}
输出:
writeln( count_match( s, "[A-Z]+", "g" ) ); // 3
writeln( count_match( s, "[A-Z]+", "gi" ) ); // 7
js /questions/tagged/js code:
var s = "ONE TWO THREE four five six seven";
var rx1 = new RegExp( "[A-Z]+" , "g" );
var rx2 = new RegExp( "[A-Z]+" , "gi" );
var counter = 0;
while( rx1.exec( s ) ){
++counter;
}
document.write( counter + "<br>" ); // 3
counter = 0;
while( rx2.exec( s ) ){
++counter;
}
document.write( counter ); // 7
好的。测试后gcc 7.1.0
事实证明,以下版本6.3.0
输出是:1 3 3
但与7.1.0
输出是1 3 7
链接在这里 https://wandbox.org/permlink/5RZpHZJGJfB1FHnE.
还有这个版本的clang
输出是正确的。链接在这里 http://rextester.com/OEWX18211。谢谢伊戈尔·坦代特尼克 user