std :: regex,匹配字符串的开头/结尾

时间:2016-09-22 17:46:58

标签: c++ regex c++11 std

在JS正则表达式中,符号^$指定字符串的开头和结尾。只有使用/m修饰符(多行模式),它们才匹配行的开头和结尾 - CR / LF之前和之后的位置。

但在std::regex / ECMAscript模式中,符号^$始终匹配行的开头和结尾

在std :: regex中有没有办法定义字符串匹配点的开头和结尾?换句话说:支持JavaScript多线模式......

4 个答案:

答案 0 :(得分:6)

默认情况下,ECMAscript模式已将^视为输入开头开头行,而$作为输入结束< em>和行尾。没有办法让它们只匹配 开头或结尾输入,但可以使它们匹配开头或结尾:

在调用std::regex_matchstd::regex_searchstd::regex_replace时,有一个std::regex_constants::match_flag_type类型的参数,默认为std::regex_constants::match_default

  • 要指定^仅匹配行首,请指定std::regex_constants::match_not_bol
  • 要指定$仅匹配行尾,请指定std::regex_constants::match_not_eol
  • 由于这些值是比特标志,要指定两者,只需按位 - 或它们在一起(std::regex_constants::match_not_bol | std::regex_constants::match_not_eol
  • 请注意,通过指定^
  • ,可以隐含输入开始而不使用std::regex_constants::match_not_bol,无论是否存在std::regex_constants::match_continuous

ECMAScript grammar documentation cppreference.comthis demo进行了详细解释,我强烈推荐cplusplus.com。

警告:我已经使用MSVC,Clang + libc ++和Clang + libstdc ++进行了测试,目前只有MSVC具有正确的行为。

答案 1 :(得分:3)

^$匹配字符串的开头和结尾,而不是一行。查看"1\n2\n3"^\d+$正则表达式中找不到任何匹配项的there are 3 matches。添加替换时(见下文),enter image description here

std::regex中没有选项可使锚点与行的开头/结尾匹配。您需要使用替换来模拟它:

^ -> (^|\n)
$ -> (?=\n|$)

请注意$可以使用(?=\n|$)完全“模拟”(您可以在其中添加更多行终止符号或符号序列,如(?=\r?\n|\r|$)),但^ ,你找不到100%的解决方法。

由于没有外观支持,您可能必须调整正则表达式模式的其他部分,因为(^|\n)比使用后备支持更频繁地使用捕获组。

答案 2 :(得分:1)

以下代码段匹配以[a-z]开头,后跟0或1点,然后是0或更多a-z字母,然后以“@ gmail.com”结尾的电子邮件地址。我测试了它。

string reg = "^[a-z]+\\.*[a-z]*@gmail\\.com$";

regex reg1(reg, regex_constants::icase);
reg1(regex_str, regex_constants::icase);
string email;
cin>>email;
if (regex_search(email, reg1))

答案 3 :(得分:0)

您可以使用Javascript正则表达式QString html = "&zwj;<span style='color:Red;'>&zwj;رب&zwj;</span>&zwj;"; str.replace("رب",html); 模拟Perl / Python / PCRE \A,该字符串在字符串的开头但在换行符之后不匹配,而Javascript正则表达式^(?<!(.|\n)])的英文意思是“与a的开头匹配”。没有前一个字符的行”。

您可以使用\z模拟仅在字符串末尾匹配的Perl / Python / PCRE (?!(.|\n))$。要获得\Z的效果,该效果仅在字符串末尾匹配,但在该字符串末尾允许一个换行符,只需添加一个可选的换行符:\n?(?!(.|\n))$