当前位置:  开发笔记 > 小程序 > 正文

regex.h:打印子表达式

如何解决《regex.h:打印子表达式》经验,为你挑选了1个好方法。

我想使用C中的regex.h库从表达式中提取子字符串.这是代码

#include 
#include 
#include 

int main(void)
{
   regex_t    preg;   
   char       *string = "Random_ddName:cateof:Name_Random";

   char       *pattern = ".*Name:\\(.*\\):Name.*";
   int        rc;     
   size_t     nmatch = 1;
   regmatch_t pmatch[1];

   if (0 != (rc = regcomp(&preg, pattern, 0))) {
      printf("regcomp() failed, returning nonzero (%d)\n", rc);
      exit(EXIT_FAILURE);
   }

   if (0 != (rc = regexec(&preg, string, nmatch, pmatch, 0))) {
      printf("Failed to match '%s' with '%s',returning %d.\n",
      string, pattern, rc);
   }
   else {  
      printf("With the whole expression, "
             "a matched substring \"%.*s\" is found at position %d to %d.\n",
             pmatch[0].rm_eo - pmatch[0].rm_so, &string[pmatch[0].rm_so],
             pmatch[0].rm_so, pmatch[0].rm_eo - 1);
   }
   regfree(&preg);

    return 0;
}

我想提取字符串"cateof",但我想确保字符串Name:和:Name之间.cateof是随机的,它会动态变化,这是我需要的唯一部分.我怎样才能立刻得到它?是否可以使用反向引用来存储我需要的值?



1> Vanni Totaro..:

您必须指定nmatch = 2,以便pmatch[0]包含所需的整个匹配和子匹配pmatch[1].

需要的代码更改:

size_t     nmatch = 2;
regmatch_t pmatch[2];

...
    pmatch[1].rm_eo - pmatch[1].rm_so, &string[pmatch[1].rm_so],
    pmatch[1].rm_so, pmatch[1].rm_eo - 1);
...


@cateof:`pmatch [0]`总是包含与模式匹配的字符串部分.你用`.*`开始和结束你的模式,所以你的整个字符串被报告为匹配模式.`pmatch [1]`,`pmatch [2]`等包含所有匹配的标记子表达式.有关[POSIX Basic Regular Expressions](http://en.wikipedia.org/wiki/Regular_expression#POSIX_Basic_Regular_Expressions),请参阅Wikipedia.因为你需要简单地忽略`pmatch [0]`并使用`pmatch [1]`.
@cateof:你已经用'\\\(.*\\\)`定义了子表达式.尝试应用我建议的更改,您将得到程序输出:`使用整个表达式,匹配的子串"cateof"位于14到19位.
推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有