将文本范围与C++;11个正则表达式 我在C++中尝试正则表达式,这里有一些代码 #include <iostream> #include <regex> int main (int argc, char *argv[]) { std::regex pattern("[a-z]+", std::regex_constants::icase); std::regex pattern2("excelsior", std::regex_constants::icase); std::string text = "EXCELSIOR"; if (std::regex_match(text, pattern)) std::cout << "works" << std::endl; else std::cout << "doesn't work" << std::endl; if (std::regex_match(text, pattern2)) std::cout << "works" << std::endl; else std::cout << "doesn't work" << std::endl; return 0; } #包括 #包括 int main(int argc,char*argv[]){ std::regex模式(“[a-z]+”,std::regex_常量::icase); 标准::正则表达式模式2(“excelsior”,标准::正则表达式常量::icase); std::string text=“EXCELSIOR”; 如果(std::regex_匹配(文本、模式))std::cout

将文本范围与C++;11个正则表达式 我在C++中尝试正则表达式,这里有一些代码 #include <iostream> #include <regex> int main (int argc, char *argv[]) { std::regex pattern("[a-z]+", std::regex_constants::icase); std::regex pattern2("excelsior", std::regex_constants::icase); std::string text = "EXCELSIOR"; if (std::regex_match(text, pattern)) std::cout << "works" << std::endl; else std::cout << "doesn't work" << std::endl; if (std::regex_match(text, pattern2)) std::cout << "works" << std::endl; else std::cout << "doesn't work" << std::endl; return 0; } #包括 #包括 int main(int argc,char*argv[]){ std::regex模式(“[a-z]+”,std::regex_常量::icase); 标准::正则表达式模式2(“excelsior”,标准::正则表达式常量::icase); std::string text=“EXCELSIOR”; 如果(std::regex_匹配(文本、模式))std::cout,c++,regex,c++11,C++,Regex,C++11,仍然限制小写字母的模式匹配。我认为中提到的字符匹配似乎不适用于显式指定的字符集,这是我所期望的,如果显式指定,处理这些字符集是有意义的。问题是由大小写敏感度引起的: std::regex_constants::icase标记被std::regex_match忽略 编辑: 添加标志std::regex_constants::collate解决了以下问题: 根据[re.grammar]中描述的规则,我们有: -在正则表达式有限状态机与字符序列的匹配过程中,两个 字符c和d使用以下规则进行比较:

仍然限制小写字母的模式匹配。我认为中提到的字符匹配似乎不适用于显式指定的字符集,这是我所期望的,如果显式指定,处理这些字符集是有意义的。

问题是由大小写敏感度引起的:

std::regex_constants::icase
标记被
std::regex_match
忽略


编辑:

添加标志
std::regex_constants::collate
解决了以下问题:


根据[re.grammar]中描述的规则,我们有:

-在正则表达式有限状态机与字符序列的匹配过程中,两个 字符
c
d
使用以下规则进行比较:
1.如果
(flags()®ex\u constants::icase)
如果
traits\u inst.translate\u nocase(c)=traits\u inst.translate\u nocase(d)
;这两个字符相等
2.否则,如果
flags()®ex\u constants::collate
如果
traits\u inst.translate(c)==traits\u inst.translate(d);

3.否则,如果
c==d
,则两个字符相等

这适用于您的
pattern2
,我们正在匹配一个字符序列,并且我们有
flags()&icase
,因此我们进行nocase比较。因为序列中的每个字符都匹配,所以它“起作用”

但是,对于
模式
,我们没有字符序列。因此我们使用以下规则:

-在正则表达式有限状态机与字符序列匹配期间,比较
将排序元素范围
c1-c2
与字符
c
进行如下操作:如果
flags()®ex_常量::collate
为false,则字符
c
匹配,如果
c1两者都应输出“works”。我测试了它。它看起来应该可以工作,但在这个在线编译器上失败了:您使用的编译器版本是什么?(GCC<4.9已经破坏了正则表达式)。@Galik it's[repeatable]()。我怀疑regex对于显式指定的字符集是准确的。但是,
collate
将使模式区域设置敏感,这可能导致不同系统上出现不可预测的行为。我认为在这种情况下,更好的解决方案是在这两种情况下声明字符。
std::regex pattern("[a-z]+", std::regex_constants::icase);
string_type str1 = string_type(1,
    flags() & icase ?
        traits_inst.translate_nocase(c1) : traits_inst.translate(c1);
string_type str2 = string_type(1,
    flags() & icase ?
        traits_inst.translate_nocase(c2) : traits_inst.translate(c2);
string_type str = string_type(1,
    flags() & icase ?
        traits_inst.translate_nocase(c) : traits_inst.translate(c);
return traits_inst.transform(str1.begin(), str1.end())
        <= traits_inst.transform(str.begin(), str.end())
    && traits_inst.transform(str.begin(), str.end())
        <= traits_inst.transform(str2.begin(), str2.end());
std::regex pattern("[a-z]+", 
                   std::regex_constants::icase | std::regex_constants::collate);