繁体   English   中英

用于解析导致错误的uevent的posix正则表达式

[英]posix regular expression for parsing uevent causing error

我正在尝试使用下面的代码解析uevent,但我认为我的正则表达式不合适,导致regcomp函数失败。

有人可以帮忙吗? 我试图做类似这样

#include <stdio.h>
#include <string.h>
#include <regex.h>

int main ()
{
  char * source = "change@/devices/soc/799999.i2c/i2c-3/3-0015/power_supply/battery";
  char * regexString = "(?<action>[a-zA-Z]+)@\\/(?<dev_path>.*)\\/(?<subsystem>[a-zA-z]+)\\/(?<name>[a-zA-z]+)";
  size_t maxGroups = 4;

  regex_t regexCompiled;
  regmatch_t groupArray[maxGroups];

  if (regcomp(&regexCompiled, regexString, REG_EXTENDED))
    {
      printf("Could not compile regular expression.\n");
      return 1;
    };
  regfree(&regexCompiled);

  return 0; 
}

我收到“无法编译正则表达式。”。 这意味着regcomp无法识别regex。

当我使用代码报告错误时:

#include <stdio.h>
#include <string.h>
#include <regex.h>

int main(void)
{
  //char * source = "change@/devices/soc/799999.i2c/i2c-3/3-0015/power_supply/battery";
  char * regexString = "(?<action>[a-zA-Z]+)@\\/(?<dev_path>.*)\\/(?<subsystem>[a-zA-z]+)\\/(?<name>[a-zA-z]+)";
  //size_t maxGroups = 4;

  regex_t regexCompiled;
  //regmatch_t groupArray[maxGroups];

  int rc;
  if ((rc = regcomp(&regexCompiled, regexString, REG_EXTENDED)) != 0)
    {
      char buffer[1024];
      regerror(rc, &regexCompiled, buffer, sizeof(buffer));
      printf("Could not compile regular expression (%d: %s).\n", rc, buffer);
      return 1;
    }
  regfree(&regexCompiled);

  return 0; 
}

我得到的输出:

Could not compile regular expression (13: repetition-operator operand invalid).

问题出在符号(?您正在使用:

"(?<action>[a-zA-Z]+)@\\/(?<dev_path>.*)\\/(?<subsystem>[a-zA-z]+)\\/(?<name>[a-zA-z]+)"

该表示法仅适用于PCRE ,而不适用于POSIX。 和PCRE一起使用? 之后(正是因为它在其他正则表达式系统(例如POSIX)中无效。

因此,如果要使用PCRE正则表达式,请安装并使用PCRE库。

否则,您将需要使用:

"([a-zA-Z]+)@\\/(.*)\\/([a-zA-z]+)\\/([a-zA-z]+)"

设置好之后,并注意到您需要一个regmatch_t来匹配整个字符串,并加上4个捕获的组(总共5个捕获),您可以编写:

#include <stdio.h>
#include <string.h>
#include <regex.h>

int main(void)
{
    char *source = "change@/devices/soc/799999.i2c/i2c-3/3-0015/power_supply/battery";
    // char * regexString = "(?<action>[a-zA-Z]+)@\\/(?<dev_path>.*)\\/(?<subsystem>[a-zA-z]+)\\/(?<name>[a-zA-z]+)";
    size_t maxGroups = 5;
    char *regexString =  "([a-zA-Z]+)@\\/(.*)\\/([a-zA-z]+)\\/([a-zA-z]+)";

    regex_t regexCompiled;
    regmatch_t groupArray[maxGroups];

    int rc;
    if ((rc = regcomp(&regexCompiled, regexString, REG_EXTENDED)) != 0)
    {
        char buffer[1024];
        regerror(rc, &regexCompiled, buffer, sizeof(buffer));
        printf("Could not compile regular expression (%d: %s).\n", rc, buffer);
        return 1;
    }
    if ((rc = regexec(&regexCompiled, source, maxGroups, groupArray, 0)) != 0)
    {
        char buffer[1024];
        regerror(rc, &regexCompiled, buffer, sizeof(buffer));
        printf("Could not execute regular expression (%d: %s).\n", rc, buffer);
        return 1;
    }

    printf("Match successful:\n");
    for (size_t i = 0; i < maxGroups; i++)
    {
        int so = groupArray[i].rm_so;
        int eo = groupArray[i].rm_eo;
        printf("%zu: %d..%d [%.*s]\n", i, so, eo, eo - so, &source[so]);
    }

    regfree(&regexCompiled);

    return 0;
}

输出为:

Match successful:
0: 0..64 [change@/devices/soc/799999.i2c/i2c-3/3-0015/power_supply/battery]
1: 0..6 [change]
2: 8..43 [devices/soc/799999.i2c/i2c-3/3-0015]
3: 44..56 [power_supply]
4: 57..64 [battery]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM