简体   繁体   English

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

[英]posix regular expression for parsing uevent causing error

I am trying to parse uevent using this below code but I think my regular expression is not proper causing regcomp function to fail. 我正在尝试使用下面的代码解析uevent,但我认为我的正则表达式不合适,导致regcomp函数失败。

Can anyone help? 有人可以帮忙吗? I am trying to do something like this . 我试图做类似这样

#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; 
}

I am getting "Could not compile regular expression.". 我收到“无法编译正则表达式。”。 It means regcomp didn't recognize the regex. 这意味着regcomp无法识别regex。

When I report on the error using the code: 当我使用代码报告错误时:

#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; 
}

I get the output: 我得到的输出:

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

The problem is in the notation (? you are using: 问题出在符号(?您正在使用:

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

That notation is for PCRE and not POSIX. 该表示法仅适用于PCRE ,而不适用于POSIX。 And PCRE uses ? 和PCRE一起使用? after ( precisely because it isn't valid in other regex systems (such as POSIX). 之后(正是因为它在其他正则表达式系统(例如POSIX)中无效。

So, if you want to use PCRE regexes, install and use the PCRE library. 因此,如果要使用PCRE正则表达式,请安装并使用PCRE库。

Otherwise, you'll need to use: 否则,您将需要使用:

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

With that in place, and noting that you need a regmatch_t for the whole of the string that's matched plus 4 captured groups (for a total of 5 captures), you can write: 设置好之后,并注意到您需要一个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;
}

and the output is: 输出为:

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