我正在尝试使用正则表达式尝试回答this question,并发现虽然regex_match
找到匹配项,但regex_search
却没有。
以下程序是用g ++ 4.7.1编译的:
#include <regex>
#include <iostream>
int main()
{
const std::string s = "/home/toto/FILE_mysymbol_EVENT.DAT";
std::regex rgx(".*FILE_(.+)_EVENT\\.DAT.*");
std::smatch match;
if (std::regex_match(s.begin(), s.end(), rgx))
std::cout << "regex_match: match\n";
else
std::cout << "regex_match: no match\n";
if (std::regex_search(s.begin(), s.end(), match, rgx))
std::cout << "regex_search: match\n";
else
std::cout << "regex_search: no match\n";
}
输出:
regex_match: match regex_search: no match
我的假设是两者都应该匹配错误,或者GCC 4.7.1中的库可能存在问题吗?
答案 0 :(得分:7)
你的正则表达式正常工作(两者都匹配,这是正确的)在VS 2012rc中。
在g ++ 4.7.1 (-std=gnu++11)
中,如果使用:
".*FILE_(.+)_EVENT\\.DAT.*"
,regex_match
匹配,但regex_search
没有。".*?FILE_(.+?)_EVENT\\.DAT.*"
,regex_match
和regex_search
都不匹配(O_o)。所有变体都应匹配,但有些变量不匹配(原因已由betabandido指出)。在g ++ 4.6.3 (-std=gnu++0x)
中,行为与g ++ 4.7.1相同。
Boost(1.50)正确匹配所有内容 w /两种模式变种。
<强>摘要强>:
regex_match regex_search ----------------------------------------------------- g++ 4.6.3 linux OK/- - g++ 4.7.1 linux OK/- - vs 2010 OK OK vs 2012rc OK OK boost 1.50 win OK OK boost 1.50 linux OK OK -----------------------------------------------------
关于你的模式,如果你意味着一个点字符'.'
,那么你应该这样写("\\."
)。您还可以使用非贪婪修饰符(?
)来减少回溯:
".*?FILE_(.+?)_EVENT\\.DAT.*"
答案 1 :(得分:3)
查看regex_search
的最新libstdc ++ source code,您会发现:
* @todo Implement this function.
不幸的是,这不是唯一留下的TODO项目。 GCC的<regex>
实施目前尚未完成。我建议使用Boost或Clang以及#ifdef
代码,直到GCC赶上来。
(这在4.8分支中都没有修复。)
答案 2 :(得分:2)
我试图在C ++ 11中使用正则表达式库,我遇到了很多问题(使用g ++ 4.6和4.7)。基本上,支持要么不存在,要么只有部分支持。即使对于SVN版本也是如此。这里有一个描述current status for the SVN version of libstdc++的链接。
因此,目前我认为最好的选择是继续使用Boost.Regex。
或者,您可以尝试使用libc++。根据{{3}},对正则表达式的支持已经完成。