我忘记正则表达式的速度比我母亲的生日快。这是一个主要的 PITA。无论如何,我想要一个 RE 来解析 HTTP 响应状态行并正确捕获子元素。我得到了这个工作:
const boost::regex status_line("HTTP/(\\d+?)\\.(\\d+?) (\\d+?) (.*)\r\n");
std::string status_test1("HTTP/1.1 200 hassan ali\r\n");
boost::smatch what;
std::cout << regex_match(status_test1,what, status_line, boost::match_extra) << std::endl;
std::cout << what.size() << std::endl;
BOOST_FOREACH(std::string s, what)
{
std::cout << s << std::endl;
}
第 4 个捕获组是我大惊小怪的,尤其是对单词进行标记。但我不需要它,所以我的工作完成了。但是,我仍然想知道如何标记一个以 '\0' 结尾的空格分隔的句子,这会导致一个向量/数组被剥离的单词。
我无法让以下片段工作
const boost::regex sentence_re("(.+?)( (.+?))*");
boost::smatch sentence_what;
std::string sentence("hassan ali syed ");
std::cout << boost::regex_match(sentence,sentence_what,sentence_re, boost::match_extra) << std::endl;
BOOST_FOREACH(std::string s, sentence_what)
{
std::cout << s << std::endl;
}
它不应该匹配"hassan ali syed "
,但应该匹配"hassan ali syed"
,并且捕获组应该输出hassan
ali
syed
(带有换行符),但它输出hassan
syed
syed
(注意,第三个 syed 中的空格<space>syed
。我想捕获组不能处理递归实体?
那么,是否有一种干净的方法可以在 PCRE 语法中指定一个标记化任务,从而产生一个干净的标记向量(没有重复——即,我不希望嵌套组尝试去除空格)。
我知道这不是工作的正确工具,spirit / lexx 或 boost::tokenise 是最好的,而且我知道这不是正确的方法。在.net 中进行屏幕抓取时,我会通过对正文重复应用正则表达式直到它用完标记来在文本正文中找到标记。