在JS正则表达式中,符号^
和$
指定字符串的开头和结尾。只有使用/m
修饰符(多行模式),它们才匹配行的开头和结尾 - CR / LF之前和之后的位置。
但在std::regex / ECMAscript模式中,符号^
和$
始终匹配行的开头和结尾。
在std :: regex中有没有办法定义字符串匹配点的开头和结尾?换句话说:支持JavaScript多线模式......
答案 0 :(得分:6)
默认情况下,ECMAscript模式已将^
视为输入开头和开头行,而$
作为输入结束< em>和行尾。没有办法让它们只匹配 开头或结尾输入,但可以使它们匹配仅开头或结尾:
在调用std::regex_match
,std::regex_search
或std::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.com对this demo进行了详细解释,我强烈推荐cplusplus.com。
警告:我已经使用MSVC,Clang + libc ++和Clang + libstdc ++进行了测试,目前只有MSVC具有正确的行为。
答案 1 :(得分:3)
^
和$
匹配字符串的开头和结尾,而不是一行。查看"1\n2\n3"
与^\d+$
正则表达式中找不到任何匹配项的there are 3 matches。添加替换时(见下文),。
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 = "‍<span style='color:Red;'>‍رب‍</span>‍";
str.replace("رب",html);
模拟Perl / Python / PCRE \A
,该字符串在字符串的开头但在换行符之后不匹配,而Javascript正则表达式^(?<!(.|\n)])
的英文意思是“与a的开头匹配”。没有前一个字符的行”。
您可以使用\z
模拟仅在字符串末尾匹配的Perl / Python / PCRE (?!(.|\n))$
。要获得\Z
的效果,该效果仅在字符串末尾匹配,但在该字符串末尾允许一个换行符,只需添加一个可选的换行符:\n?(?!(.|\n))$
。