我忘记正则表达式的速度快于母亲的生日。它是主要的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;
}
第四捕获组就是我一直在忙的话题,特别是对这些词进行标记。但是我不需要它,所以我的工作完成了。但是,我仍然想知道如何对以'\ 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中,在进行屏幕抓取时,我会通过在正文中重复应用正则表达式直到其用完标记来在文本主体中找到标记。
最佳答案
这使我想起了类似的问题Capturing repeating subpatterns in Python regex。
如果将以空格分隔的单词的数量限制为令牌的最大数量,那么您可以使用大量额外的子模式,例如:
"HTTP/(\\d+?)\\.(\\d+?) (\\d+?) ([^ ]+\s)?([^ ]+\s)?([^ ]+\s)?([^ ]+\s)?\n\r"
这当然是可怕的。
如果您需要一个嵌套的组,我认为在regexp实现中没有“重复子模式”支持就无法完成(请参见链接问题中使用的Python非标准
regex
模块。)您几乎肯定会做得更好基本字符串函数-您本地等效的string.split()
。