当前位置:  技术问答>linux和unix

关于正则表达式“(?=pattern)”型匹配

    来源: 互联网  发布时间:2017-02-09

    本文导语:         在LINUX C下使用正则"Windows (?=95|98|NT|2000)"匹配"Windows 95"中的“Windows ”不成功,为什么?   程序运行时,regcomp返回“REG_BADRPT”,查了下手册,这样描述: Invalid use of repetition operators such as using '*' a...

       在LINUX C下使用正则"Windows (?=95|98|NT|2000)"匹配"Windows 95"中的“Windows ”不成功,为什么?  
程序运行时,regcomp返回“REG_BADRPT”,查了下手册,这样描述:
Invalid use of repetition operators such as using '*' as the first character.
也就是说,是“?”号用错了,系统把它识别成repetition operators,但网上标准的正则都是这么写的呀?难道regex.h不支持“(?=pattern)”这种匹配形式?

请各位大大们悉心指导下。

代码如下:

#include
#include
#include
#include
/* 取子串的函数 */
void substr (char *dest,char *str, unsigned start, unsigned end)
{
  unsigned n = end - start;
    printf("n%u n",n);
  strncpy(dest, str + start, n);
  dest[n] = 0;
}
int Pattern(char *str,char *pattern,char *result)
{
    int cflags=REG_EXTENDED,z;
    regex_t reg;
    regmatch_t pm[10];
    const size_t nmatch=10;
    z = regcomp (®, pattern, cflags);
    printf("%dn",z);
    if(z!=0) return z;
    z = regexec (®, str, nmatch, pm, 0);
    printf("%dn",z);
    if(z!=0) return z;
    substr(result,str, pm[0].rm_so, pm[0].rm_eo);
    return z;
}

int main(int argc, char **argv)
{
    char result[100];
    Pattern("Windows 95","Windows (?=95|98|NT|2000)",result);
    printf("%sn",result);
  return 0;
}

|
在正则表达式测试器中测试了下你的正则,是对的。
但是在C中就是不对。错误提示为:Invalid preceding regular expression,大概意思是:接在Windows后的这个表达式无效吧,具体什么原因我也不太清楚,供你参考下。


#include
#include
#include
#include

/* 取子串的函数 */
void substr (char *dest,char *str, unsigned start, unsigned end)
{
  unsigned n = end - start;
  printf("[%u, %u)=%un", start, end, n);
  strncpy(dest, str + start, n);
  dest[n] = 0;
}

int Pattern(char *str,char *pattern,char *result)
{
    int cflags=REG_EXTENDED, z;
    regex_t reg;
    regmatch_t pm[10];
    const size_t nmatch=10;
char errmsg[100] = {0};

    z = regcomp (®, pattern, cflags);
    printf("1. z=%dn",z);
    if(z!=0)
{
regerror(z, ®, errmsg, 100);
printf("1. errmsg=[%s]n", errmsg);
return z;
}
    z = regexec (®, str, nmatch, pm, 0);
    printf("2. z=%dn",z);
    if(z!=0)
{
regerror(z, ®, errmsg, 100);
printf("2. errmsg=[%s]n", errmsg);
return z;
}
    substr(result, str, pm[0].rm_so, pm[0].rm_eo);

    return z;
}

int main(int argc, char **argv)
{
    char result[100] = {0};
char pat[] = "Windows (?=95|98|NT|2000)";
    int ret = Pattern("Windows 95", pat, result);
    printf("ret=%d, result=[%s]n", ret, result);

    return 0;
}


输出:
[zcm@tmp #56]$make
gcc -g -o a a.c
[zcm@tmp #57]$./a
1. z=13
1. errmsg=[Invalid preceding regular expression]
ret=13, result=[]
[zcm@tmp #58]$

    
 
 

您可能感兴趣的文章:

  • Perl 正则表达式之角色化记忆
  • js正则表达式之RegExp对象之compile方法 编译正则表达式
  • Linux c++ boost库正则表达式用法
  • 正则表达式 表示 非指定字符串开头的正则
  • Python通过正则表达式获取,去除(过滤)或者替换HTML标签的几种方法
  • 正则表达式问题,使用正则表达式找出指定字符串并替换?
  • linux bash shell命令:文本搜索工具grep正则表达式元字符集(基本集)
  • 正则表达式概述 什么是正则表达式 .
  • JS 正则表达式的相关方法(正则学习笔记1)
  • jQuery中的正则表达式分析 正则基础
  • java 正则表达式基础,实例学习资料收集大全 原创
  • 哪些命令可以使用正则表达式
  • 常用正则表达式及评注-学习正则必备
  • (菜鸟飞飞)问个正则表达式的问题
  • 向大家推荐一个收集整理正则表达式的网站
  • 正则表达式的问题
  • 关于正则表达式匹配问题
  • Python 匹配任意字符(包括换行符)的正则表达式写法
  • php 正则 不包含某字符串的正则表达式
  • Java正则表达式 reb4j
  • 大虾,请问谁有正则表达式的资料?谢谢!
  • 正则匹配后面非指定字符的正则 原创
  • shell 正则匹配问题 反向匹配 负匹配
  • 帮忙看看这个shell脚本,用正则匹配字符串为什么匹配不上
  • 正则表达式匹配
  • php正则表达式中的非贪婪模式匹配
  • JS:一个匹配日期的正则
  • c#匹配整数和小数的正则表达式
  • 正则式如何只匹配一个汉字?
  • 关于正则表达式的匹配
  • 一个匹配形如“#100”的正则表达式
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • c#正则过滤图片标签 asp.net正则过滤的例子
  • java使用正则表达校验手机号码示例(手机号码正则)
  • PHP html标签正则替换并可自定义正则规则
  • python正则表达式去掉数字中的逗号(python正则匹配逗号)
  • 正则表达式口诀_学习正则的朋友值得一看
  • Javascript里的两种使用正则的方法
  • 常用正则 常用的C#正则表达式
  • 寻求正则表达试
  • 学习IP地址的正则表达式
  • asp.net正则表达式提取中文的代码示例
  • 正则表达式中使用变量赋值
  • 网络技术 iis7站长之家
  • java正则表达式验证函数
  • linux下有什么函数可以处理正则表达式?
  • emacs里空行的正则表达式如何写?
  • 正则式 ^[^ ](.*[^ ])?$ 的含义
  • 关于sed的正则表达式
  • 正则表达式小疑问
  • killall 正则表达式用法
  • 询问一个关于正则表达式的问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3