#include <boost/regex.hpp>
#include <string>
#include <vector>
#include <iostream>
int main(int argc, char* argv[]) {
std::string text = argv[1];
std::string patterns = argv[2];
boost::regex regex = boost::regex(patterns);
boost::smatch match;
std::cout << boost::regex_search(text, match, regex) << std::endl;
}
如果我在输入hello¿ ¿
(包含UTF-8编码的非ASCII字符)上运行程序,则返回0
,即未找到,但如果我在输入hel√上运行它√(再次包含非ascii)它返回1,即找到。
我的问题:在运行utf字符时boost::regex
(即ascii版本)的预期行为是什么?
编辑:感谢所有评论,我仍然感兴趣的是为什么输出1,因为文本和正则表达式都包含非ascii字符。我的猜测是字节被解释为ascii,因此它们匹配。
答案 0 :(得分:5)
在ASCII字符串上使用正则表达式,是关于使用&#34; bytes&#34;找到一个模式。
在UTF-8字符串上使用正则表达式是关于在&#34;多字节&#34;上使用正则表达式。序列,其中序列表示Unicode代码点。
因此,正则表达式应用于Unicode字符串,其编码具有每个字符可变的字节数。
UTF-8字符串包含1到4个字节的多字节序列,表示Unicode&#34;字符&#34;。
在UTF-8中,只有ASCII 7位字符是1字节&#34;宽&#34;。
所以 - 在UTF-8编码的字符串上使用ASCII正则表达式引擎 ,忽略UTF-8编码字符串中的多字节序列并导致模式匹配字节字节。 UTF-8编码字符串 上的ASCII正则表达式引擎用法的结果无效 。
请查看http://utfcpp.sourceforge.net
要使正则表达式处理UTF-8编码的字符串,您必须...
std::codecvt_utf8
临时设置全局区域设置以使正则表达式正常工作,或者 regex_search函数在匹配时返回布尔值和true
在您的情况下,ASCII正则表达式模式匹配UTF-8编码字符串的一部分,该字符串被无效地解析为ASCII字符串 - 正如您所假设的那样!
如果您使用UTF-8编码的字符串中的英文文本,则可以安全地使用ASCII正则表达式引擎。保留ASCII 7位范围,使得ASCII正则表达式引擎的结果不可靠。
答案 1 :(得分:0)
这是一个错误,而不是一个功能: 我在一个更好的系统上尝试了你的例子(在Windows MinGW上的g ++ 4.9.2)并且一切顺利:
#include <iostream>
#include <string>
#include <regex>
int main()
{ std::string text ="hello¿"; // or "hello√"
std::string patterns ="¿"; // or "√"
std::regex regex = std::regex(patterns);
std::smatch match;
std::cout << std::regex_search(text, match, regex) << std::endl;
}
带输出:
1