使用 C 中的 regex.h 计算匹配数

2023-12-06

我正在使用 POSIX 正则表达式regex.h用 C 语言计算英语文本片段中短语出现的次数。 但返回值是regexec(...)只告诉是否找到匹配项。所以我尝试使用nmatch and matchptr找到不同的外观,但是当我打印出匹配项时matchptr,我刚刚收到文本中出现的第一个短语的第一个索引。

这是我的代码:

#include <sys/types.h>
#include <regex.h>
#include <stdio.h>

#define MAX_MATCHES 20 //The maximum number of matches allowed in a single string

void match(regex_t *pexp, char *sz) {
    regmatch_t matches[MAX_MATCHES];
    if (regexec(pexp, sz, MAX_MATCHES, matches, 0) == 0) {
    for(int i = 0; i < MAX_MATCHES; i++)
        printf("\"%s\" matches characters %d - %d\n", sz, matches[i].rm_so, matches[i].rm_eo);
    } 
    else {
        printf("\"%s\" does not match\n", sz);
    }
}

int main(int argc, char* argv[]) {
    int rv;
    regex_t exp;
    rv = regcomp(&exp, "(the)", REG_EXTENDED | REG_ICASE);
    if (rv != 0) {
        printf("regcomp failed\n");
    }
    match(&exp, "the cat is in the bathroom.");
    regfree(&exp);
    return 0;
}

如何使此代码报告正则表达式的两个不同匹配项(the)在字符串中the cat is in the bathroom?


你已经明白了的意思pmatch错误地。它不用于获取重复的模式匹配。它用于获取一场比赛的位置及其可能的子组。作为 Linux 手册regcomp(3) says:

子表达式的偏移量从i次打开 括号存储在pmatch[i]。整个正则表达式的匹配地址存储在pmatch[0]。 (请注意,要返回 N 个子表达式匹配的偏移量,nmatch必须至少N+1.) 任何未使用的结构元素都将包含该值-1.

如果你有正则表达式this (\w+) costs (\d+) USD,括号内有2个捕获组(\w+) and (\d+);现在如果nmatch被设置为至少 3,pmatch[0]将包含整场比赛的开始和结束索引,pmatch[1]的开始和结束(\w+)组和pmatch[2]为了(\d+) group.


以下代码应打印连续匹配的范围(如果有)(每个范围的开头是第一个字符在匹配范围内,范围的结尾是第一个字符比赛结束后,匹配rm_so, rm_eo用法);或字符串"<the input string>" does not contain a match如果图案never火柴。

它经过精心构造,因此也适用于零长度正则表达式(空正则表达式,或者说正则表达式#?将在每个字符位置匹配,包括最后一个字符之后;将报告该正则表达式的 28 个匹配项以供输入the cat is in the bathroom.)

#include <sys/types.h>
#include <regex.h>
#include <stdio.h>
#include <string.h>


void match(regex_t *pexp, char *sz) {
    // we just need the whole string match in this example    
    regmatch_t whole_match;

    // we store the eflags in a variable, so that we can make
    // ^ match the first time, but not for subsequent regexecs
    int eflags = 0;
    int match = 0;
    size_t offset = 0;
    size_t length = strlen(sz);

    while (regexec(pexp, sz + offset, 1, &whole_match, eflags) == 0) {
        // do not let ^ match again.
        eflags = REG_NOTBOL;
        match = 1;
        printf("range %zd - %zd matches\n",
               offset + whole_match.rm_so,
               offset + whole_match.rm_eo);

        // increase the starting offset
        offset += whole_match.rm_eo;

        // a match can be a zero-length match, we must not fail
        // to advance the pointer, or we'd have an infinite loop!
        if (whole_match.rm_so == whole_match.rm_eo) {
            offset += 1;
        }

        // break the loop if we've consumed all characters. Note
        // that we run once for terminating null, to let
        // a zero-length match occur at the end of the string.
        if (offset > length) {
            break;
        }
    }
    if (! match) {
        printf("\"%s\" does not contain a match\n", sz);
    }
}


int main(int argc, char* argv[]) {
    int rv;
    regex_t exp;
    rv = regcomp(&exp, "(the)", REG_EXTENDED | REG_ICASE);
    if (rv != 0) {
        printf("regcomp failed\n");
    }
    match(&exp, "the cat is in the bathroom.");
    regfree(&exp);
    return 0;
}

P.S.,正则表达式中的括号(the)在这种情况下是不必要的;你可以写the(你最初对在同一位置获得两场比赛的困惑是因为你会获得一场比赛(the)和一个子匹配the,如果你没有这些括号,你的代码只会打印第一个匹配的位置一次)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 C 中的 regex.h 计算匹配数 的相关文章

  • 如何知道并加载特定文件夹中的所有图像?

    我有一个应用程序 C Builder 6 0 需要知道特定文件夹中的图像总数 然后我必须加载它们 在 ImageList 或 ComboBoxEx 中 或任何其他控件中 我怎样才能做到这一点 我知道如何在控件中加载图像 或保存在 TList
  • 如何在 C# 事件中区分更改是由代码还是由用户进行?

    我有一个简单的TextBox一开始是空的 我有一个简单的事件 TextChanged 可以知道用户何时更改了其中的任何内容TextBox 但是 如果我自己在代码中对其执行任何操作 该事件就会触发 喜欢设置textbox Text Test
  • 浮点提升:stroustrup vs 编译器 - 谁是对的?

    在 Stroustrup 的新书 C 编程语言 第四版 第 10 5 1 节中 他说 在执行算术运算之前 整数提升用于从较短的整数类型创建整数 类似地 浮点提升是用于从浮点数创建双精度数 我用以下代码确认了第一个声明 include
  • 字节到二进制字符串 C# - 显示所有 8 位数字

    我想在文本框中显示一个字节 现在我正在使用 Convert ToString MyVeryOwnByte 2 但是 当字节开头有 0 时 这些 0 就会被删除 例子 MyVeryOwnByte 00001110 Texbox shows g
  • 对数字进行向上和向下舍入 C++

    我试图让我的程序分别向上和向下舍入数字 例如 如果数字是3 6 我的程序应该四舍五入最接近的数字 4 如果该数字是3 4 它将向下舍入为 3 我尝试使用ceil库获取 3 个项目的平均值 results ceil marks1 marks2
  • 使用 VSTO 更改 Outlook 设置

    我刚刚花了大约 4 个小时试图弄清楚如何以编程方式检索 设置 Microsoft Outlook 2010 的 Outlook 设置 我所说的 设置 是指文件 选项 邮件下的设置 我想做的是检索用户设置的设置列表 自动化我们每天需要在某些消
  • 用于验证网络路径的正则表达式 PHP、jQuery、JavaScript、Ruby

    尝试找出用于验证网络路径的正则表达式 即 comp xyz or comp or comp x y z storage或者所有部分都更长的东西 但希望能够传达其要点 我目前拥有的是一个简单的输入字段 用户可以通过它传递信息 事情是我不希望他
  • Qt中正确的线程方式

    我的图像加载非常耗时 图像很大 并且在加载时也完成了一些操作 我不想阻止应用程序 GUI 我的想法是在另一个线程中加载图像 发出图像已加载的信号 然后用该图像重绘视图 我的做法 void Window loadImage ImageLoad
  • 控制台应用程序 .net Core 2.0 的配置

    在 net Core 1 中我们可以这样做 IConfiguration config new ConfigurationBuilder AddJsonFile appsettings json true true Build 这样就可以使
  • 成员初始值设定项列表中的求值顺序是什么?

    我有一个带有一些参数的构造函数 我假设它们是按照列出的顺序初始化的 但在一种情况下 它们似乎是按相反的顺序初始化的 导致中止 当我反转参数时 程序停止中止 下面是我正在使用的语法的示例 a 之前需要初始化b 在这种情况下 你能保证这个初始化
  • C#:使用 System.Text 和 System.Text.RegularExpressions 之间的区别

    在 ASP NET C 应用程序中 我注意到为了使用 Regex 和 StringBuilder 我必须将两者都放在 using System Text using System Text RegularExpressions 从简单的角度
  • _mm_max_ss 在 clang 和 gcc 之间有不同的行为

    我正在尝试使用 clang 和 gcc 交叉编译一个项目 但在使用时发现一些奇怪的差异 mm max ss e g m128 a mm set ss std numeric limits
  • 当格式字符串包含“{”时,String.Format 异常

    我正在使用 VSTS 2008 C Net 2 0 执行以下语句时 String Format 语句抛出 FormatException 有什么想法是错误的吗 这是获取我正在使用的 template html 的位置 我想在 templat
  • 在可观察项目生成时对其进行处理

    我有一个IObservable它会生成一次性物品 并且在其生命周期内可能会生成无限数量的物品 因此 我想在每次生成新项目时处理最后一个项目 因此Using http reactivex io documentation operators
  • 使用 Linq 进行异步Where过滤

    我有一个List通过填充的元素async调用 WebService 没问题 我需要过滤该列表以便在应用程序视图上显示某些内容 我试过这个 List
  • 编写专门用于类及其子类的函数模板

    我正在尝试编写一个函数模板 一个版本应该用于不满足另一版本标准的所有类型 当参数是给定类的基类或该类本身时 应使用另一个版本 我尝试过超载Base 但是当类派生自Base 他们使用通用的 而不是特定的 我也尝试过这种 SFINAE 方法 s
  • 通过 MSBuild 调用 cl.exe 时无限期挂起

    我正在尝试在我的 主要是 C 项目上运行 MSBuild 想象一下一个非常庞大的代码库 Visual Studio 2015 是有问题的工具集 Windows 7 SP1 和 VS 2015 更新 2 即使使用 m 1 从而迫使它仅使用一个
  • 便携式终端

    有没有办法根据所使用的操作系统自动使用正确的 EOL 字符 我在想类似的事情std eol 我知道使用预处理器指令非常容易 但很好奇它是否已经可用 我感兴趣的是 我的应用程序中通常有一些消息 稍后我会将这些消息组合成一个字符串 并且我希望将
  • 宏观评价[重复]

    这个问题在这里已经有答案了 可能的重复 未定义的行为和序列点 https stackoverflow com questions 4176328 undefined behavior and sequence points 我无法理解以下宏
  • 在 C# 中读取/写入命令行程序

    我正在尝试与 C 的命令行程序进行对话 它是一个情绪分析器 它的工作原理如下 CMD gt java jar analyser jar gt Starting analyser 这是我想从我的 C 程序插入内容的地方 例如 I love y

随机推荐

  • 如何实现 PHP/HTML 缓存

    我读过几本关于实现 php 缓存系统的指南 我的网站是自定义编码的 查询量相当大并且不断增长 包括这个 http www snipe net 2009 03 quick and dirty php caching 我完全理解它们 但页面的某
  • 无法在 Windows 10 Pro 上启动 docker?

    Problem 当我尝试启动 docker 桌面时 它给我留下了这个错误 Unable to create The running command stopped because the preference variable ErrorA
  • .NET 客户端通过 SSL 连接到 IBM MQ

    我从客户端获得了密钥文件 我需要使用它们通过 SSL 连接到 MQ 我们从客户那里得到的文件是 xxx crl xxx kdb xxx rdb xxx sth xxx tab 他们说的是客户端频道表 我正在尝试使用以下代码进行连接 他们说我
  • 将 UTC 日期时间字符串转换为本地日期时间

    我从来没有需要在 UTC 和 UTC 之间进行时间转换 最近有人请求让我的应用程序了解时区 但我一直在兜圈子 有关将本地时间转换为 UTC 的大量信息 我发现这些信息相当简单 也许我也做错了 但我找不到任何有关轻松将 UTC 时间转换为最终
  • 如何在C#中访问匿名类型的属性?

    我有这个 List nodes new List nodes Add new Checked false depth 1 id div d Id 我想知道是否可以获取匿名对象的 Checked 属性 我不确定这是否可能 尝试这样做 if n
  • 如何在 Angular 2 上实现自定义验证器?

    如何在 Angular 2 中实现自定义验证器 I found 这个笨蛋 constructor private fb FormBuilder this form fb group singleSelection Rio App valid
  • 为什么 C 应用程序不先打印消息然后接收用户输入

    我正在尝试编写一个打印提示并接受用户输入的 C 应用程序 我用 fgets 编写了一个简单的程序 但它确实工作正常 我正在使用 eclipse c c 工具包 当我保存 gt 构建 gt 运行时 控制台保持空白 如果我输入一些输入 程序就会
  • apc vs eaccelerator vs xcache

    我正在研究使用其中哪一个 但我真的找不到一个脱颖而出的 E加速器比APC 但APC维护得更好 Xcache更快 但其他的语法更简单 有人对使用哪些建议以及为什么使用有建议吗 APC 将包含在 PHP 6 中 我猜选择它是有充分理由的 它的安
  • vector.push_back 上的“glibc free():无效的下一个大小(快速)”?

    当我运行我的程序时 它偶尔会崩溃并给出以下错误 检测到 glibc pathtoexecutable free 下一个大小无效 快速 回溯导致一个成员函数只调用向量的push back函数 void Path add Position p
  • 用于将重复行插入另一个表的插入触发器之前

    我有一张桌子叫tblspmaster其中 sp 列我有唯一索引 因此不会插入重复项 但我想将重复行插入到tblspduplicate 所以我决定为此编写触发器 IN 主表是tblspmaster记录将使用加载文件插入mysql create
  • 条形图上的错误栏

    我试图得到 一个漂亮的组条形图 我希望每个条形上都有误差条 如下所示 或类似的 由您自行决定 我有办法 ff Medical eq Patient Hygiene Near bed Far bed Direct 1 2759 0 9253
  • 为什么我的 XML 阅读器读取所有其他元素?

    我构建了一个非常简单的表格 显示 4 列和 4 行 执行以下代码时 它会显示 xml 文件中的所有其他元素 它不区分每个表行 它读起来没有任何问题 而且我已经运行了 xml 验证器 所以这不是语法问题 public partial clas
  • 什么时候需要条件变量,互斥锁还不够吗?

    我确信互斥锁还不够 这就是条件变量概念存在的原因 但这让我很困惑 当条件变量至关重要时 我无法用具体的场景说服自己 条件变量 互斥锁和锁之间的区别问题的接受答案说条件变量是 带有 信号 机制的锁 当线程需要时使用它 等待资源变得可用 线程可
  • FFMPEG 链接错误

    我正在尝试编译此版本的修改版本来自 FFMPEG 站点的转码示例 我已经使用了所有必需的包含并使用此加入了库 INCLUDEPATH FFMPEG DEV PATH include LIBS L FFMPEG DEV PATH lib la
  • 无论如何,我可以突出显示 JTable 中的一行吗?

    我目前正在使用 JTable 和 DefaultTableModel 构建数据库 在我的程序中我 具有允许用户搜索数据库的功能 我已经构建了搜索部分 但没有 知道如何突出显示 JTable 中的行或单元格 有人可以帮帮我吗 谢谢 您确定要突
  • PHP 访问数组值[重复]

    这个问题在这里已经有答案了 我正在尝试访问我创建的数组的值 但似乎失败了 我正在循环发送 VIA http 的数组 并添加docno and entryno到名为的新数组 ArrID 它可以添加到新数组中 但是当我尝试访问ArrID似乎没有
  • Sequelize 连接模型包括多对多

    假设我有三个这样的模型 var User define user username Sequelize INTEGER var UserPubCrawl define userpubcrawl user id Sequelize STRIN
  • Python中重新赋值会从内存中删除之前的值吗?

    gt gt p 5 gt gt id p 140101523888800 gt gt p 5 56 gt gt id p 140100617985840 我知道将新值分配给现有变量时 它指向内存中存储新值的新位置 但我的问题是 包含先前值的
  • selenium python 中 find_element_by_class_name 的属性是什么?

    browser webdriver Firefox browser get url divs browser find elements by class name class browser find element by class n
  • 使用 C 中的 regex.h 计算匹配数

    我正在使用 POSIX 正则表达式regex h用 C 语言计算英语文本片段中短语出现的次数 但返回值是regexec 只告诉是否找到匹配项 所以我尝试使用nmatch and matchptr找到不同的外观 但是当我打印出匹配项时matc