亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2755 | 回復(fù): 5
打印 上一主題 下一主題

POSIX正則無法匹配中括號(hào)的問題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2010-07-01 15:18 |只看該作者 |倒序?yàn)g覽
本帖最后由 wrongway88_cu 于 2010-07-01 16:06 編輯

有一個(gè)字符串是"[大家好]",想提取出其中的"大家好",用regcomp和regexec兩個(gè)函數(shù)做的,pattern是這樣寫的
char pattern[] = "\[([^\]]+)\]";
char pattern[] = "\[([^\\]]+)\]";
char pattern[] = "\[([^\\\]]+)\]";
char pattern[] = "[([^]]+)]";
char pattern[] = "[([^\\\]]+)]";
以上均無法匹配,我該如何寫呢?

程序代碼如下:
#include <stdio.h>
#include <regex.h>
#include <string.h>

int main(int argc, char **argv) {
    regex_t re;
    regmatch_t subs[10];
    char errbuf[256];
    char matched[256];
    char pattern[] = "[([^]]+)]";
    char string[] = "[大家好]";
    int err, i;
    const size_t nmatch = 10;
    size_t len;

    err = regcomp (&re, pattern, REG_EXTENDED);
    if (err)
    {
        len = regerror (err, &re, errbuf, sizeof (errbuf));
        fprintf (stderr, "error: regcomp: %s\n", errbuf);
        exit (1);
    }

    printf ("Total has subexpression: %d\n", re.re_nsub);
    /* execute pattern match */
    err = regexec (&re, string, nmatch, subs, 0);
    if (err == REG_NOMATCH)
    {
        fprintf (stderr, "Sorry, no match ...\n");
        regfree (&re);
        exit (0);
    }
    else if (err)
    {
        len = regerror (err, &re, errbuf, sizeof (errbuf));
        fprintf (stderr, "error: regexec: %s\n", errbuf);
        exit (1);
    }


    /* if no REG_NOMATCH and no error, then pattern matched */
    printf ("\nOK, has matched ...\n\n");
    for (i = 0; i <= re.re_nsub; i++)
    {
        if (i == 0)
        {
        printf ("begin: %d, end: %d, ",subs.rm_so, subs.rm_eo);
        }
        else
        {
        printf ("subexpression %d begin: %d, end: %d, ", i, subs.rm_so, subs.rm_eo);
        }
        len = subs.rm_eo - subs.rm_so;
        memcpy(matched, string + subs.rm_so, len);
        matched[len] = '\0';
        printf("match: %s\n", matched);
    }

    regfree(&re);
    exit(0);


}

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2010-07-01 15:49 |只看該作者
自己頂一下

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2010-07-01 16:41 |只看該作者


  1. $ cat reg.c
  2. #include <stdio.h>
  3. #include <regex.h>
  4. #include <string.h>

  5. int main(int argc, char **argv) {
  6.     regex_t re;
  7.     regmatch_t subs[10];
  8.     char errbuf[256];
  9.     char matched[256];
  10.     char pattern[] = "\\[(.*)]";
  11.     char string[] = "[大家好]";
  12.     int err, i;
  13.     const size_t nmatch = 10;
  14.     size_t len;

  15.     err = regcomp (&re, pattern, REG_EXTENDED);
  16.     if (err)
  17.     {
  18.         len = regerror (err, &re, errbuf, sizeof (errbuf));
  19.         fprintf (stderr, "error: regcomp: %s\n", errbuf);
  20.         exit (1);
  21.     }

  22.     printf ("Total has subexpression: %d\n", re.re_nsub);
  23.     /* execute pattern match */
  24.     err = regexec (&re, string, nmatch, subs, 0);
  25.     if (err == REG_NOMATCH)
  26.     {
  27.         fprintf (stderr, "Sorry, no match ...\n");
  28.         regfree (&re);
  29.         exit (0);
  30.     }
  31.     else if (err)
  32.     {
  33.         len = regerror (err, &re, errbuf, sizeof (errbuf));
  34.         fprintf (stderr, "error: regexec: %s\n", errbuf);
  35.         exit (1);
  36.     }


  37.     /* if no REG_NOMATCH and no error, then pattern matched */
  38.     printf ("\nOK, has matched ...\n\n");
  39.     for (i = 0; i <= re.re_nsub; i++)
  40.     {
  41.         if (i == 0)
  42.         {
  43.         printf ("begin: %d, end: %d, ",subs[i].rm_so, subs[i].rm_eo);
  44.         }
  45.         else
  46.         {
  47.         printf ("subexpression %d begin: %d, end: %d, ", i, subs[i].rm_so, subs[i].rm_eo);
  48.         }
  49.         len = subs[i].rm_eo - subs[i].rm_so;
  50.         memcpy(matched, string + subs[i].rm_so, len);
  51.         matched[len] = '\0';
  52.         printf("match: %s\n", matched);
  53.     }

  54.     regfree(&re);
  55.     exit(0);


  56. }

  57. $ gcc -o reg reg.c
  58. reg.c: In function ‘main’:
  59. reg.c:21:9: warning: incompatible implicit declaration of built-in function ‘exit’
  60. reg.c:24:5: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘size_t’
  61. reg.c:31:9: warning: incompatible implicit declaration of built-in function ‘exit’
  62. reg.c:37:9: warning: incompatible implicit declaration of built-in function ‘exit’
  63. reg.c:60:5: warning: incompatible implicit declaration of built-in function ‘exit’
  64. $ ./reg
  65. Total has subexpression: 1

  66. OK, has matched ...

  67. begin: 0, end: 11, match: [大家好]
  68. subexpression 1 begin: 1, end: 10, match: 大家好
  69. $
復(fù)制代碼

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2010-07-01 17:08 |只看該作者
為什么是 \\[ 呢?

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2010-07-01 17:15 |只看該作者
我用PHP寫的規(guī)則是 \[([^]]+)] ,為什么到了C就不好使了呢?

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2010-07-02 08:17 |只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP