gpt4 book ai didi

c++ - 正则表达式在 g++ 4.9 下匹配但在 g++-5.3.1 下失败

转载 作者:行者123 更新时间:2023-11-28 05:40:44 25 4
gpt4 key购买 nike

我正在用正则表达式标记一个字符串;这在 g++-4.9 下正常工作,但在 g++-5.3.1 下失败。

我有以下 txt 文件:

0001-SCAND ==> "Scandaroon" (from Philjumba)
0002-KINVIN ==> "King's Vineyard" (from Philjumba)
0003-HANNI ==> "Hannibal: Rome vs. Carthage" (from Philjumba)
0004-LOX ==> "Lords of Xidit" (from Philjumba)

我正在使用正则表达式、空格、引号对和括号对对其进行标记化。例如,第一行应该标记如下:

0001-SCAND
==>
"Scandaroon"
(from Philjumba)

我写了下面的std::regex:

std::regex FPAT("(\\S+)|(\"[^\"]*\")|(\\([^\\)]+\\))";

我用以下方法标记字符串:

std::vector<std::string>
split( const std::string & input, const std::regex & regex ) {

std::sregex_token_iterator
first{input.begin(), input.end(), regex, 0},
last;

return {first, last};
}

这将返回匹配项。在 g++-4.9 下,字符串按要求进行标记化,但在 g++-5.3.1 下,它的标记化如下:

0001-SCAND
==>
"Scandaroon"
(from
Philjumba)

或者第三行标记化如下:

0003-HANNI
==>
"Hannibal:
Rome
vs.
Carthage"
(from
Philjumba)

可能是什么问题?


编辑:我按如下方式调用函数:

std::string line("0001-SCAND ==> \"Scandaroon\" (from Philjumba)");
auto elems = split( line, FPAT );

编辑:根据@xaxxon 的反馈,我用 vector 替换了返回迭代器,但它在 g++-5.3 下仍然无法正常工作。

std::vector<std::string>
split( const std::string & input, const std::regex & regex ) {

std::sregex_token_iterator
first{input.begin(), input.end(), regex, 0},
last;

std::vector< std::string > elems;
elems.reserve( std::distance(first,last) );

for ( auto it = first; it != last; ++ it ) {
//std::cout << (*it) << std::endl;
elems.push_back( *it );
}

return elems;
}

最佳答案

正则表达式渴望

因此对于正则表达式 "Set|SetValue" 和文本 "SetValue",正则表达式找到 "Set"

你必须仔细选择顺序:

std::regex FPAT(R"(("[^\"]*\")|(\([^\)])+\)|(\S+))");

\S+ 最后考虑。

另一种选择是不使用默认选项(参见 http://en.cppreference.com/w/cpp/regex/syntax_option_type )并使用 std:::::regex::extended

std::regex FPAT(R"((\S+)|("[^\"]*\")|(\([^\)])+\))", std::::regex::extended);

看来 g++-5.3.1 已经修复了 g++-4.9 之后的一个 bug。

关于c++ - 正则表达式在 g++ 4.9 下匹配但在 g++-5.3.1 下失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37147546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com