std regex_search 仅匹配当前行

2023-12-06

我使用各种正则表达式逐行解析 C 源文件。首先我读取字符串中文件的所有内容:

ifstream file_stream("commented.cpp",ifstream::binary);

std::string txt((std::istreambuf_iterator<char>(file_stream)),
std::istreambuf_iterator<char>());

然后我使用一组正则表达式,它应该连续应用,直到找到匹配,这里我只给出一个示例:

vector<regex> rules = { regex("^//[^\n]*$") };

char * search =(char*)txt.c_str();

int position = 0, length = 0;

for (int i = 0; i < rules.size(); i++) {
  cmatch match;

  if (regex_search(search + position, match, rules[i],regex_constants::match_not_bol | regex_constants::match_not_eol)) 
  {
     position += ( match.position() + match.length() );        
  }

}

但这不起作用。它将匹配不在当前行中的注释,但它将搜索整个字符串,以查找第一个匹配项,regex_constants::match_not_bol and regex_constants::match_not_eol应该使regex_search去辨认^$仅作为行的开始/结束,而不是整个块的结束开始/结束。这是我的文件:

评论.cpp:

#include <stdio.h>
//comment

代码应该失败,我的逻辑是使用 regex_search 的这些选项,匹配应该失败,因为它应该在第一行搜索模式:

#include <stdio.h>

但它会搜索整个字符串,并立即找到//comment。我需要帮助,使regex_search仅在当前行匹配。选项match_not_bol and match_not_eol不要帮助我。当然,我可以在向量中逐行读取文件,然后对向量中每个字符串的所有规则进行匹配,但是它非常慢,我已经这样做了,并且解析像这样的大文件需要很长时间这就是为什么我想让正则表达式处理新行并使用定位计数器。


如果这不是你想要的,请评论,我会删除答案

您所做的不是使用正则表达式库的正确方法。
因此,这是我对任何想要使用的人的建议std::regex图书馆。

  1. 它只支持ECMAScript有点 比所有现代人都穷regex图书馆。
  2. 它有尽可能多的错误(只是我发现的):

    1. 相同的正则表达式,但在 Linux 和 Windows 上结果不同(仅限 C++)
    2. std::regex 和忽略标志
    3. std::regex_match 和具有奇怪行为的惰性量词
  3. 在某些情况下(我专门测试了std::match_results) 这是200相比慢了几倍std.regex in d语言

  4. 它有非常令人困惑的flag-match而且几乎不起作用(至少对我来说)

结论:根本不要使用它。


但如果有人仍然要求使用c++无论如何,你可以:

  1. use boost::regex about Boost library because:

    1. It is PCRE support
    2. 它的错误较少(我没有看到任何错误)
    3. 它较小于bin文件(我的意思是编译后的可执行文件)
    4. 那么就更快了std::regex
  2. use gcc version 7.1.0 and NOT以下。我发现的最后一个错误是在版本中6.3.0

  3. use clang version 3或以上

如果你已经引诱(=说服)NOT use c++那么你可以使用:

  1. Use d regular expression link library for large task: std.regex and why:

    1. Fast Faster Command Line Tools in D
    2. Easy
    3. Flexible drn
  2. Use native pcre or pcre2 link that have been written in c

    • 速度极快但有点复杂
  3. Use perl for a simple task and specially Perl one-liner link
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

std regex_search 仅匹配当前行 的相关文章

随机推荐

  • 从向量中提取时使用 NA 作为索引

    在下面的代码中 x lt 1 8 x NA 我期待着一个TRUE or FALSE回答但我有八个NA反而 我发现了is na提供了TRUE FALSE我正在寻找的 但是 我仍然不确定为什么用向量子集NA结果是NA 有什么解释吗 来自索引中的
  • 在列表中查找具有给定属性值的对象,然后查找字典值

    我有一个对象列表 这些对象中的每一个都有一个Name财产 以及ObservablePairCollection这只是一个自定义字典 其工作方式与字典完全相同 具有键 值对 给定两个字符串 一个用于名称 一个用于键 我想找到第一个与给定名称匹
  • 使用 selenium 运行的无头 Chrome

    System setProperty webdriver chrome driver usr bin google chrome final ChromeOptions chromeOptions new ChromeOptions chr
  • 使 tkinter 窗口出现在所有其他窗口之上

    usr bin env python Display window with toDisplayText and timeOut of the window from Tkinter import def showNotification
  • 使用服务帐户凭据的 GDrive 导出失败并显示 404

    我有一个使用 OAuth 客户端从 GDrive 文件导出文本的脚本 效果非常好 import googleapiclient discovery as google from apiclient http import MediaIoBa
  • 在 Python 中复制嵌套列表

    我想复制一个二维列表 这样如果我修改一个列表 另一个列表就不会被修改 对于一维列表 我只是这样做 a 1 2 b a 现在如果我修改b a没有被修改 但这不适用于二维列表 a 1 2 3 4 b a 如果我修改b a也会被修改 我该如何解决
  • 如何从基本控制器中的 OnActionExecuting 重定向?

    我尝试了两种方法 Response Redirect 不执行任何操作 以及调用基本控制器内部的新方法返回 ActionResult 并让它返回 RedirectToAction 这些都不起作用 如何从 OnActionExecuting 方
  • 如何修复“无法加载 TClassName 的单元 UnitName 符号信息。您想尝试自己查找此文件吗?”

    在delphi 中 创建ActiveX 控件曾经比现在更流行 然而 仍然可以使用 Delphi 创建 ActiveX 控件 这个问题假设Delphi 2007 但无论你使用什么Delphi版本 它都应该是相同的 当您创建 ActiveX 控
  • 移动文本模式光标不起作用

    我一直致力于在我目前正在开发的操作系统中移动文本模式光标 我根本无法让它显示出来 这是我用来更新光标的代码 void update cursor unsigned char cursor loc y pos Cols x pos curso
  • 如何确定给定 wxWidgets 中当前字体的字符串的大小

    有没有办法根据 C wxWidgets中当前选择的字体确定给定字符串的显示长度 以像素为单位 例如 如果我打印出字符串 Speed 并希望在 和后面的值之间放置 10 个像素 我需要知道 Speed 字符串有多长 有没有办法确定这一点 我似
  • 带有 Spark 流的多个 writeStream

    我正在使用 Spark Streaming 在尝试实现多个写入流时遇到一些问题 下面是我的代码 DataWriter writeStreamer firstTableData parquet CheckPointConf firstChec
  • Scala 注释实际上是什么? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我不懂Java 开始学习Scala 什么是注释以及它们的用途是什么 注释是附加到类 方法
  • 将 url 参数传递给 swf (flash) 影片

    这里是Flash新手 我正在尝试在浏览器中加载 swf 文件并将 url 参数传递给 flash 影片 如何在actionscript中访问flash电影中的url参数 这是一个示例网址 我确实找到了通过嵌入 对象标签传递参数的指针 但没有
  • MockMvc WebAppConfiguration:在 web.xml 中加载 servlet 映射

    我正在使用 MockMvc 编写集成测试 我想知道是否有一种方法可以从 web xml 加载 servlet 映射 这通常不重要 我有一个习惯HandlerInteceptor与请求 URI 匹配 来自HttpServletRequest
  • Trac,如何分层组织页面?

    I use trac管理我的项目 我想以与 trac 项目相同的方式组织 wiki 页面 即按类别 子类别等 标题索引trac 网站上的页面很好地解释了我想要获得的结果 我该如何实现这一目标 首先 你可以创建分层的wiki页面 只需修改ur
  • 有没有办法改变 UIToolbar 的高度?

    我有一个UIToolbar在 Interface Builder 中 我注意到它的高度被锁定为 44px 当然 我想把它做得更大 Apple 允许调整此控件的大小吗 如果是这样 我该怎么办 当然 只需将其框架设置不同即可 myToolbar
  • python 日志记录 - 使用 JSON 日志,我可以为每个日志添加“额外”值吗?

    我正在使用蟒蛇logging模块 以及python json logger我想添加一些键 app name myapp env prod 自动查看我的所有日 志 无需执行以下操作 logger info Something happened
  • 为什么当我设置元素位置:绝对时线性渐变消失?

    我制作了一个渐变背景 我想将这个文本块居中 我的目标是创建一个位于屏幕中间中心的标题 无论视口的分辨率如何 所以我把这个 header 设置为绝对位置 并使用了我在网上找到的这种集中方法 它完美地集中 问题是 渐变背景变成白色 看起来标题位
  • 查找开放会话数

    我正在寻找一种简单 无数据库 的方法来列出网站上有多少活跃用户 我能想到的最简单的方法是计算打开会话的数量 这段代码应该管用 number of users count scandir ini get session save path 当
  • std regex_search 仅匹配当前行

    我使用各种正则表达式逐行解析 C 源文件 首先我读取字符串中文件的所有内容 ifstream file stream commented cpp ifstream binary std string txt std istreambuf i