【问题标题】:Find matching substring to a regex查找与正则表达式匹配的子字符串
【发布时间】:2015-06-15 15:17:14
【问题描述】:

假设我有一个长字符串,它是由所有匹配某个正则表达式的子字符串组成的。

例如,我有 2 个正则表达式:

标识符:^[a-z]\S

接线员:^(:|;|*)

给定以下字符串:

a12vc+adh*v15

我想得到所有匹配的项目,比如:

While(hasNextRegex(str)) {
  printf("%s\n", nextRegex(str));
} 

将打印:

a12vc   (first match) 
+       (second match) 
adh     (third match) 
*       (fourth match) 
v15     (fifth match) 

我正在为正则表达式使用slre 库。仅限 C 语言。

你对我的问题有什么想法吗?提前致谢!!

【问题讨论】:

  • 比利你有 1k 代表你至少可以格式化你的问题:)
  • 您能否更好地解释您的问题?您提供的任何正则表达式都不会产生您想要的任何匹配项。
  • @Fede 当我使用网络时,我正在这样做。目前我正在使用移动设备。
  • 由于\S 匹配任何非空格字符,因此您的标识符似乎必须为两个字符长并以小写字母开头。因此,aa、aZ、a+ 和 a~ 是合法标识符。尚不清楚 a: 或 a; 或 a* 是否应该是合法标识符。您对字符串的期望的解释与您的正则表达式想要匹配的不匹配。您需要学习 SLRE 支持的正则表达式语言,以及库的 API。
  • @JonathanLeffler - 我确实有一些不准确之处,这就是我说for example的原因。这不是问题。假设我确实有一个有效的正则表达式,问题是如何将它们作为子字符串捕获。

标签: c regex substring


【解决方案1】:

README.md 中与 SLRE 一起分发的文档包含使用单个 RE 进行迭代搜索的示例。您需要决定您需要使用的 RE 并应用该示例中显示的技术。

鉴于字符串a12vc+adh*v15 将产生值:

  1. a12vc
  2. +
  3. adh
  4. *
  5. v15

您需要一个能够识别标识符(初始字母,后续字母数字)和运算符(单个标点字符)的正则表达式。 SLRE 文档表明 SLRE 不支持\w。

因此,标识符匹配(如果使用不区分大小写):

[a-z][a-z0-9]*

如果需要/需要,您可以在模式中添加下划线。

运营商包括:

[*+-/;:]

因此,应该工作的正则表达式是:

([a-z][a-z0-9]*|[*+-/;:])

因此,示例中的代码可以修改为:

#include "slre.h"
#include <stdio.h>

int main(void)
{
    static const char str[] = "a12vc+adh*v15";
    static const char regex[] = "([a-z][a-z0-9]*|[*+-/;:])";
    struct slre_cap caps[1];
    int str_len = sizeof(str) - 1;
    const char *base = str;
    const char *end = str + sizeof(str);

    while (base < end)
    {
        int len = slre_match(regex, base, str_len, caps, 1, SLRE_IGNORE_CASE);
        if (len <= 0)
            break;
        printf("Found token: [%.*s]\n", caps[0].len, caps[0].ptr);
        base += len;
        str_len -= len;
    }
    return 0;
}

样本输出:

Found token: [a12vc]
Found token: [+]
Found token: [adh]
Found token: [*]
Found token: [v15]

这看起来像请求的内容。

【讨论】:

    猜你喜欢
    • 2014-11-26
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2011-11-08
    • 2022-07-11
    • 2018-07-16
    • 2015-04-02
    • 2017-08-29
    相关资源
    最近更新 更多