当字符串Im匹配是多行字符串时,我遇到了C ++ 0x regex的问题。 以下是我尝试使用的代码段:
std::smatch regMatch;
std::string data = "<key>id</key><string>1</string>\n<key>user</key><string>admin</string>";
if (std::regex_match(data, regMatch, std::regex("<key>user</key><string>(.*?)</string>"))) {
std::cout << "Reg match: " << regMatch[1].str() << std::endl;
}
答案 0 :(得分:6)
您应该使用regex_search
代替regex_match
。
顺便说一下,为什么不使用(.*)
代替(.*?)
?
答案 1 :(得分:3)
默认情况下,点.
与换行符不匹配。您可以将开关(?s)
添加到正则表达式的开头,以打开该点的换行符匹配:
(?s)<key>user</key><string>(.*?)</string>
但是,我并不是这方面的忠实粉丝,因为并非所有语言都在其正则表达式引擎中支持这一点。此外,您的正则表达式模式的另一部分可能涉及一个您 想要匹配换行符的点。我首选的方法是只使用包含字符类的字符集,例如\ s或\ w及其否定类。告诉正则表达式匹配这是一种非常直接的方式,它绝对匹配所有内容:
<key>user</key><string>([\w\W]*?)</string>
也许我误解了你的XML将如何被解析,但是我必须说你打算用关键名称来捕获字符串有点奇怪&#34 ;用户&#34;可能包含也可能不包含换行符(以及其他空白字符和所有其他字符)。对于名为
的用户,你真的没问题吗? admin$#*
&% '";
_____
?