【问题标题】:PCRE get match position without getting all matchesPCRE 获取匹配位置而不获取所有匹配项
【发布时间】:2014-05-13 11:35:42
【问题描述】:

我正在使用 pcre_exec 应用我从文件中读取的一些正则表达式。由于正则表达式可能包含重复计数,例如[a-z]{1000},因此我必须传递一个 3*1001 整数的匹配向量才能获得第一个元素,这会告诉我匹配开始/结束的位置。

我只需要开始/结束位置,而不是所有匹配(组)位置。 pcre_exec 返回 0,根据手册,这意味着“您需要更大的匹配向量”。

我的问题是,如何在不传递任意大的匹配向量的情况下获得开始/结束。或者至少,我怎么知道我需要传递多大的向量。

【问题讨论】:

    标签: c regex text pcre


    【解决方案1】:

    0 表示,你有一个成功的匹配,但是 ovector 太小了。只有大约 2/3 的条目将填充实际值。唯一的例外是前两个值,如果 ovector 大小 >= 2,它们将被填充。因此只需传递一个 'int ovector[2]' 来获取开始和结束。

    两个音符:

    a) 如果你传递一个小的 ovector,PCRE 将分配一个,它的大小就足够了。看到这条评论:

    /* 如果表达式的反向引用比提供的偏移量可以容纳的多,我们会得到一个临时的工作存储块以在匹配期间使用。否则,我们可以使用提供的向量,将其大小向下舍入为 3 的倍数。*/

    您无法通过这种方式减少软件的内存消耗。

    b) 这不会引入任何捕获括号:[a-z]{1000},因此您不需要传递具有 3*1001 值的数组。甚至 ([a-z]{1000}) 或 ([a-z]){1000} 也只添加一个捕获括号。

    【讨论】:

    • 关于您的第二个问题(对不起,我错过了),将 PCRE_INFO_CAPTURECOUNT 传递给 pcre_fullinfo 以检索捕获括号的数量。
    • 所以你说我从 pcre_exec 得到的 0 在我的情况下意味着别的东西(除了“3 个条目太少”)。我确实给了 pcre_exec 一个 3 项 ovector,FWIW。
    猜你喜欢
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多