在 C 中编译/匹配 POSIX 正则表达式

2024-03-03

我正在尝试匹配字符串中的以下项目pcode:

  • u后跟 1 或 2 位数字
  • phaseu
  • phasep
  • x(被非单词字符包围)
  • y(被非单词字符包围)
  • z(被非单词字符包围)

我尝试使用 POSIX 正则表达式函数(如下所示)实现正则表达式匹配,但有两个问题:

  1. 编译后的模式似乎没有子模式(即compiled.n_sub == 0)。
  2. 该模式在字符串“u0”中没有找到匹配项,而它确实应该找到匹配项!

我相信正则表达式字符串本身可以工作——因为它可以在 python 和 TextMate 中工作——我的问题在于 C 中的编译等。任何帮助使其工作的帮助将不胜感激。

预先感谢您的回答。

if(idata=tb_find(deftb,pdata)){
    MESSAGE("Global variable!\n");
    char pattern[80] = "((u[0-9]{1,2})|(phaseu)|(phasep)|[\\W]+([xyz])[\\W]+)";
    MESSAGE("Pattern = \"%s\"\n",pattern);
    regex_t compiled;
    if(regcomp(&compiled, pattern, 0) == 0){
        MESSAGE("Compiled regular expression \"%s\".\n", pattern);
    }

    int nsub = compiled.re_nsub;
    MESSAGE("nsub = %d.\n",nsub);
    regmatch_t matchptr[nsub];
    int err;
    if(err = regexec (&compiled, pcode, nsub, matchptr, 0)){
        if(err == REG_NOMATCH){
            MESSAGE("Regular expression did not match.\n");
        }else if(err == REG_ESPACE){
            MESSAGE("Ran out of memory.\n");
        }
    }
    regfree(&compiled);
}

看来您打算使用类似于“扩展”POSIX 正则表达式语法的东西。 POSIX 定义了两种不同的正则表达式语法,“基本”(读为“过时”)语法和“扩展”语法。要使用扩展语法,您需要添加REG_EXTENDED标记为regcomp:

...
if(regcomp(&compiled, pattern, REG_EXTENDED) == 0){
...

如果没有此标志,regcomp 将使用“基本”正则表达式语法。有一些重要的区别,例如:

  • 不支持|操作员
  • 子匹配的括号需要转义,\( and \)

还应该指出的是POSIX 扩展正则表达式语法与 Python 正则表达式不是 1:1 兼容(不知道 TextMate)。特别是,我担心您的正则表达式的这一部分在 POSIX 中不起作用,或者至少不可移植:

 [\\W]

指定非空格字符的 POSIX 方法是:

 [^[:space:]]

POSIX 的整个正则表达式在 C 中应该如下所示:

 char *pattern = "((u[0-9]{1,2})|(phaseu)|(phasep)|[^[:space:]]+([xyz])[^[:space:]]+)";
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C 中编译/匹配 POSIX 正则表达式 的相关文章

随机推荐

  • 带时间戳零的 PHP 日期返回 1 小时

    如果我执行以下操作 date H i s 0 它返回01 00 00 同时它should give 00 00 00 它可能与我的本地主机的时区有关吗 世界标准时间 1 如果是这样 我该如何解决这个问题 致电前设置时区date 你将使用da
  • 为什么在SciPy中使用integrate.odeint时不调用Dfun(gradient)?

    任何人都可以提供一个向 a 提供雅可比行列式的示例吗 integrate odeintSciPy 中的函数 我尝试从 SciPy 教程运行此代码代码示例 http docs scipy org doc scipy dev reference
  • gwt 中的会话管理

    我正在开发 GWT ext 应用程序 在此应用程序中 我管理客户端会话 为此我写了下面的代码 管理会话 导入 com google gwt user client Timer public class ClientTimers privat
  • 创建霍夫曼树时增加权重时哪个节点向左或向右

    我正在尝试创建一棵霍夫曼树 但阅读互联网上的几个链接时我有点困惑 有些在左侧添加较大 就权重而言 的子节点 有些在右侧添加 所以我的问题是 1 在哪里添加节点 左边还是右边 真的有问题吗 2 我可以在右侧添加权重较大的节点还是在左侧添加权重
  • 使用映射与记录之间的差异以及何时使用

    我正在尝试将一些使用 Map 的 Java 代码映射到 Typescript 代码 我最初的想法是在 Typescript 中使用 Map 但对于我创建的界面来说这并没有成功 相反 我发现 Records 似乎完美地模拟了 Java 的 M
  • Nodejs API 调用将未定义返回到 lambda 函数

    这是将调用 api 的 aws lambda 函数 use strict var request require request exports handler function event context callback let url
  • 添加对旧变更日志文件的更改。液体碱

    我有很多包含数据库初始数据的变更日志文件 之前所有表都位于 Postgres 公共模式中 但现在我已将它们分布在不同模式之间 以便初始数据的更改无法到达表 我可以用初始数据更改所有旧文件并添加 schemaName my schema 还是
  • 从电子邮件标头转换数据

    有谁可以帮助我如何转换电子邮件标题中的数据 我有电子邮件标题中的下一个日期格式 Wed 28 Apr 2010 21 59 49 0400 我需要将它们转换为 mysql 日期或时间戳 谢谢 你应该使用DateTime http php n
  • 让其他人可以在 Xcode 中访问我的开发团队

    我有一个 单一会员 Apple 会员资料 与我合作的一位开发人员需要访问我的开发团队来测试他在其设备上构建的应用程序 Xcode 不允许他在没有该资料的情况下构建应用程序 我怎样才能让他访问开发团队 而不必向他提供我帐户的登录凭据 由于您拥
  • 如何从另一张表中获取精确匹配的数据?

    我在 数据库 工作表中有数据 如下所示 我编写了一个简短的代码来获取与 数据库 工作表中的某些条件匹配的数据 并将其粘贴到另一张 选定记录 工作表上 这是我的代码 Sub CopyData Dim db As Worksheet Dim r
  • 我应该将私有类方法设置为静态吗?

    是否有将类中的私有方法设为静态的最佳实践 我有一堂有几种方法的课 其中一些可以很容易地静态化 因为它们只是处理数据 我应该让它们静态还是让它们保持原样 这更多的是风格问题吗 有性能方面的考虑吗 Edit 方法可以变成静态的 但是应该吗 ht
  • 为什么 strdup 被认为是邪恶的

    我看过一些海报说strdup是邪恶的 对此有共识吗 我使用它时没有任何负罪感 并且看不出为什么它比使用它更糟糕malloc memcpy 我唯一能想到的可能是赚钱strdup众所周知 调用者可能会滥用它 例如 没有意识到他们必须释放返回的内
  • 将秒转换为分钟、小时和天的函数

    问题 编写一个程序 要求用户输入秒数 其工作原理如下 一分钟有 60 秒 如果用户输入的秒数大于或等于 60 则程序应显示该秒数中的分钟数 一小时有 3600 秒 如果用户输入的秒数大于或等于 3600 则程序应显示该秒数内的小时数 一天有
  • 添加 Sprite 的多个实例?

    我正在构建一个自定义图像选择器 它显示 6 个替代版本 然而 照片只显示在第 6 件商品上 model selectedPhoto返回一个 Sprite 并且不会让应用程序正常运行 但是当我使用 model photos ii 每个项目都添
  • 何时在 TypeScript / Angular 中使用接口和模型

    我最近观看了有关 Angular 2 with TypeScript 的教程 但不确定何时使用接口以及何时使用数据结构模型 接口示例 export interface IProduct ProductNumber number Produc
  • Blazor 服务器端应用程序上的子 Blazor 应用程序

    将客户端 Blazor 应用添加到服务器端 Blazor 应用 Hi 继续这里的有用答案 升级到预览版 6 后 Blazor 子应用程序出现 404 错误 https stackoverflow com questions 56586677
  • 如何在新的 AppDomain 中运行 WPF 应用程序?执行程序集失败

    我正在尝试使用应用程序域从控制台应用程序启动 WPF 应用程序 但当我这样做时 我会收到意想不到的错误 独立运行 WPF 应用程序可以正常工作 这段代码也有效 var baseDirectory AppDomain CurrentDomai
  • 更多 coproc 问题

    这是后续bash coproc 和剩余的 coproc 输出 https stackoverflow com questions 7651946 我最终决定一次一行处理文件的习惯用法是 coproc cat auto etc build c
  • 如何使用 isalnum、isdigit、isupper 来测试字符串的每个字符? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试制作一个密码强度模拟器 它要求用户输入密码 然后返回分数 我在用 islanum isdigit isupper 尝试看看输入的
  • 在 C 中编译/匹配 POSIX 正则表达式

    我正在尝试匹配字符串中的以下项目pcode u后跟 1 或 2 位数字 phaseu phasep x 被非单词字符包围 y 被非单词字符包围 z 被非单词字符包围 我尝试使用 POSIX 正则表达式函数 如下所示 实现正则表达式匹配 但有