免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1990 | 回复: 4
打印 上一主题 下一主题

求助:正则表达式多匹配了一个字符【已解决】 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-02-28 20:54 |只看该作者 |倒序浏览
代码如下
#include <stdio.h>
#include <sys/types.h>
#include <regex.h>
#include <stdlib.h>
#include <string.h>

#define SUBSLEN 10
#define EBUFLEN 128 /* error buffer length */
#define BUFLEN 1024 /* matched buffer length */

int main (int argc, char **argv)
{
    size_t len; /* store error message length */
    regex_t re; /* store compilned regular expression */
    regmatch_t subs[SUBSLEN]; /* store matched string position */
    char matched[BUFLEN]; /* store matched strings */
    char errbuf[EBUFLEN]; /* store error message */
    int err, i;
    char string[] = "http+++http://club.cat898.com/newbbs/dispbbs.asp?boardid=1&id=2098717<;";
    char pattern[] = "(ftp|https?)://([[:alnum:]*_.-]*:[[:alnum:]*_.-]*@)?[[:alnum:]*_.-]{,250}(:[0-9]+)?(/([[:alnum:]*_.-/]{,250}([?][[:alnum:]*_.-=]{,250}(&[[:alnum:]*_.-=]{,250})*)?)?)?";

    printf ("String : %s\n", string);
    printf ("Pattern: %s\n", pattern);

    /* compile regular expression */
    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, (size_t)SUBSLEN, 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[i].rm_so, subs[i].rm_eo);
        }
        else
        {
            printf ("subexpression %d begin: %d, end: %d, ",
                i, subs[i].rm_so, subs[i].rm_eo);
        }
    len = subs[i].rm_eo - subs[i].rm_so;
    memcpy (matched, string + subs[i].rm_so, len);
    matched[len] = '\0';
    printf ("match: %s\n", matched);
    }
    regfree(&re);
    exit(0);
}

但是执行结果却不是我想要的:
String : http+++http://club.cat898.com/newbbs/dispbbs.asp?boardid=1&;id=2098717<
Pattern: (ftp|https?)://([[:alnum:]*_.-]*:[[:alnum:]*_.-]*@)?[[:alnum:]*_.-]{,250}(:[0-9]+)?(/([[:alnum:]*_.-/]{,250}([?][[:alnum:]*_.-=]{,250}(&[[:alnum:]*_.-=]{,250})*)?)?)?
Total has subexpression: 7

OK, has matched ...

begin: 7, end: 70, match: http://club.cat898.com/newbbs/dispbbs.asp?boardid=1&;id=2098717<
subexpression 1 begin: 7, end: 11, match: http
subexpression 2 begin: -1, end: -1, match:
subexpression 3 begin: -1, end: -1, match:
subexpression 4 begin: 29, end: 70, match: /newbbs/dispbbs.asp?boardid=1&id=2098717<
subexpression 5 begin: 30, end: 70, match: newbbs/dispbbs.asp?boardid=1&id=2098717<
subexpression 6 begin: 48, end: 70, match: ?boardid=1&id=2098717<
subexpression 7 begin: 58, end: 70, match: &id=2098717<
主要就是最后的那个<也匹配进去了,在正则表达式中最后是(&[[:alnum:]*_.-=]{,250})*,
并没有包括字符<
请问是为什么?
谢谢!!!

[ 本帖最后由 13706808 于 2008-3-2 10:10 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-03-01 16:54 |只看该作者

希望得到解答
谢谢

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
3 [报告]
发表于 2008-03-01 17:44 |只看该作者
看样子在 (&[[:alnum:]*_.-=]{,250})* 里面你误用了 [], 换成 (&[[:alnum:]*_.=-]{,250})* 就没问题了。

论坛徽章:
0
4 [报告]
发表于 2008-03-02 10:10 |只看该作者
原帖由 MMMIX 于 2008-3-1 17:44 发表
看样子在 (&[[:alnum:]*_.-=]{,250})* 里面你误用了 [], 换成 (&[[:alnum:]*_.=-]{,250})* 就没问题了。



3Q Very Much!!!!!!
真的很感谢!
也真的很不好意识,因为最开始的时候是 (&[[:alnum:]*_.-]{,250})*
后面发现URL后面还会有等号,就直接添加在了最后面,没有想到是这里出错了
第一次写正则表达式
谢谢了!

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
5 [报告]
发表于 2008-03-03 09:09 |只看该作者
原帖由 13706808 于 2008-3-2 10:10 发表



3Q Very Much!!!!!!
真的很感谢!
也真的很不好意识,因为最开始的时候是 (&[[:alnum:]*_.-]{,250})*
后面发现URL后面还会有等号,就直接添加在了最后面,没有想到是这里出错了
第一次写正则表达式
...

嗯,- 在 [] 里面是有特殊含义的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP