gpt4 book ai didi

c++ - 使用 boost 正则表达式标记文本

转载 作者:行者123 更新时间:2023-11-28 08:07:48 25 4
gpt4 key购买 nike

我忘记正则表达式的速度比我妈妈的生日还快。这是一个主要的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' 结尾的空格分隔的句子,这会产生一个 vector/剥离词数组。

我无法让下面的片段工作

  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 语法中指定标记化任务,从而生成一个干净的标记 vector (没有重复——即,我不希望嵌套组尝试去除空格)。

我知道这不是这项工作的正确工具,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()

关于c++ - 使用 boost 正则表达式标记文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9891984/

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