当前位置: 技术问答>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)”这种匹配形式?
请各位大大们悉心指导下。
代码如下:
程序运行时,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后的这个表达式无效吧,具体什么原因我也不太清楚,供你参考下。
输出:
[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]$
但是在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]$