Ⅰ C语言正则表达式
现在很多种语言都支持正则表达式,据说有个老外的书不错,精通正则表达式,内哎,可惜,我们这小地方买本容书比较难,C语言当然支持,许多主流语言都支持,正则表达式可以很大的提升效率,一段小代码就能实现长篇大论的程序,很精彩
Ⅱ 用C语言完成一个正则表达式的匹配: 字符串中只有*和是可变字符且位置和个数不固定,其他的字符位置固定
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
//1、'?'很好处理,只要在原有的定位函数中加一点点就行:
int index(char *s,char *t,int pos)
{
int i=pos,j=0,lens=strlen(s),lent=strlen(t);
while(i<lens&&j<lent)
{
if(s[i]==t[j]||t[j]=='?')
{
++i;
++j;
}
else
{
i=i-j+1;
j=0;
}
}
if(j==lent)return i-lent;
else return -1;
}
/*2、'*'的处理有些麻烦,很自然的想法是'*'把整个串分成若干不含'*'的子串,
拿这些子串依次匹配S串。
按这样的方法可以把S串分成两类:
A、T=T1*T2*...Tn*,其中Ti为不含'*'的子串,且不为空(T1可为空)。
B、T=T1*T2*...Tn
二者的差别只在于尾部是否有'*'。
拿T匹配S,
首先 T1匹配S头部,index(s,t1,0)==0
然后 用循环完成后面的匹配,从前一次匹配后的末尾位置开始向后匹配,
如果匹配成功再把末尾位置记录下来。这里只用了最左匹配,为什么就足够了呢?
比如实际中的情况T1串可能在S串不止出现一次,为什么只考虑最左一个呢?
因为整个匹配过程是从左向右,最左匹配可以保证余下的S子中最长,更有利于后面T子串的匹配成功,
试想如果T1最左匹配不成功,靠右一些有可能成功吗?
例:T="*is*a*" S="this is a program"
T 子串"is"在S中有出现两个位置,匹配的时候只需要考虑最左边那个"is"就行了,
因为最左边的"is"匹配成功后,余下的S子串是" is a program",余下的T子串是"*a",
最左匹配可使余下的S子串最长,匹配的可能最大,最容易匹配的情况已经验证了,
就不用再做无用功了。
*/
int match(char *s,char *t)
{
int i=0,j=0,lens=strlen(s),lent=strlen(t);
char buf[128];
int bufp=0;
while(j<lent&&t[j]!='*')
{
buf[bufp]=t[j];
++bufp;++j;
}
buf[bufp]='\0';
if(index(s,buf,0)!=0)return 0;
i=bufp;
while(1)
{
while(j<lent&&t[j]=='*')++j;
if(j==lent)return 1;
bufp=0;
while(j<lent&&t[j]!='*')
{
buf[bufp]=t[j];
++bufp;++j;
}
buf[bufp]='\0';
if(j==lent)
{
if(index(s,buf,i)!=lens-bufp)return 0;
return 1;
}
if((i=index(s,buf,i))==-1)return 0;
i+=bufp;
}
}
void main()
{
char s[128];
char t[128]="mad*se$?243*.xml";
memset(s,'\0',128);//初始化s
printf("输入字符串,进行匹配\n");
gets(s);
if(match(s,t))
printf("匹配\n");
else
printf("不匹配\n");
}
Ⅲ C语言怎么用正则表达式
借用c的正抄则表达式库,需要引入头文件<regex.h>。支持POSIX.2正则表达式标准。简单用法如:
regex_t reg; //先声明一个正则表达式体。
regcomp(®, "[a-zA-Z]*", 0); //从字符串来编译这个表达式。
regmatch_t match[2]; //用来保存匹配结果。
regexec(®, "abcedfg", 2, match, 0); //匹配字符串。
此外,c++中也有自己的正则表达式库,比如boost::regex。需要先安装boost库才能使用。
Ⅳ C语言使用 正则表达式匹配不成功
pattern_ssid, 是什么,我想你这里写错了,应该是上面定义的pattenrn吧
还有,你的ret_ssid没有定义就是用了
Ⅳ c语言下如何用正则或者字符串查找匹配特定字符串并提取出来
在字符抄串中查找袭字符串是吧
#include<stdio.h>
intfun(char*str,char*find)
{
inti,j,n=0;
for(i=0;str[i];i++)
{
if(str[i]==find[0])
for(j=1;;j++)
{
if(find[j]==0)returni+1;//返回位置
if(find[j]==str[i+j])n++;
elsebreak;
}
}
return0;//不存在返回0
}
intmain()
{
charstr[]="onetwothree",find[]="two";
printf("%d ",fun(str,find));
return0;
}
Ⅵ C语言用正则表达式的例子
在格式化输入的时候可以用正则表达式
其它地方貌似没有应用。
123456int i;char str[80], str2[80];scanf("%d%[abc]%s", &i, str, str2); scanf("%[a-zA-Z0-9]", str);scanf("%[^abce]", str);scanf("%[^a-z]", str);
这几个都是用正内则表达式的。
如果不理解容
可以自己搜一下
scanf
正则表达式
网上有很多人讲的,我就不复制了。
Ⅶ 如何在C语言中使用正则表达式
看到大家讨论这方面的东西,作点贡献聊表各位高手对这个版快的无私奉献 :oops:
如果用户熟悉Linux下的sed、awk、grep或vi,那么对正则表达式这一概念肯定不会陌生。由于它可以极大地简化处理字符串时的复杂
度,因此现在已经在许多Linux实用工具中得到了应用。千万不要以为正则表达式只是Perl、Python、Bash等脚本语言的专利,作为C语言程序
员,用户同样可以在自己的程序中运用正则表达式。
标准的C和C++都不支持正则表达式,但有一些函数库可以辅助C/C++程序员完成这一功能,其中最著名的当数Philip Hazel的Perl-Compatible Regular Expression库,许多Linux发行版本都带有这个函数库。
编译正则表达式
为了提高效率,在将一个字符串与正则表达式进行比较之前,首先要用regcomp()函数对它进行编译,将其转化为regex_t结构:
int regcomp(regex_t *preg, const char *regex, int cflags);
参数regex是一个字符串,它代表将要被编译的正则表达式;参数preg指向一个声明为regex_t的数据结构,用来保存编译结果;参数cflags决定了正则表达式该如何被处理的细节。
如果函数regcomp()执行成功,并且编译结果被正确填充到preg中后,函数将返回0,任何其它的返回结果都代表有某种错误产生。
匹配正则表达式
一旦用regcomp()函数成功地编译了正则表达式,接下来就可以调用regexec()函数完成模式匹配:
int regexec(const regex_t *preg, const char *string, size_t nmatch,regmatch_t pmatch[], int eflags);
typedef struct {
regoff_t rm_so;
regoff_t rm_eo;
} regmatch_t;
参数preg指向编译后的正则表达式,参数string是将要进行匹配的字符串,而参数nmatch和pmatch则用于把匹配结果返回给调用程序,最后一个参数eflags决定了匹配的细节。
在调用函数regexec()进行模式匹配的过程中,可能在字符串string中会有多处与给定的正则表达式相匹配,参数pmatch就是用来保
存这些匹配位置的,而参数nmatch则告诉函数regexec()最多可以把多少个匹配结果填充到pmatch数组中。当regexec()函数成功返
回时,从string+pmatch[0].rm_so到string+pmatch[0].rm_eo是第一个匹配的字符串,而从
string+pmatch[1].rm_so到string+pmatch[1].rm_eo,则是第二个匹配的字符串,依此类推。
释放正则表达式
无论什么时候,当不再需要已经编译过的正则表达式时,都应该调用函数regfree()将其释放,以免产生内存泄漏。
Ⅷ 如何在C语言中巧用正则表达式
sscanf
取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。
sscanf("123456abcdedfBCDEF","%[1-9a-z]",buf);
printf("%s\n",buf);
给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中
sscanf("iios/12DDWDFF@122","%*[^/]/%[^@]",buf);
printf("%s\n",buf);
结果为:123456abcdedf
http://ke..com/link?url=ZO-DAritgCoX9mmRA--1WbzOKbzEn-5T4MhgljTpSCt-Fq
Ⅸ 如何用正则表达式来匹配c语言风格的注释
C语言风格,只支持一种 就是/**/包含的
虽然现在C一样可以用//注释整行,不过这个不是C风格,而是C++风格,只是后来C也通用了。 (C99)
只考虑/**/
正则表达式如下
/\*(.|[\r\n])*?\*/
Ⅹ C语言有正则表达式吗
1、标准的C和C++都不支持正则表达式,但有一些函数库可以辅助C/C++程序员完成这一功能,其中最著名回的当数Philip Hazel的Perl-Compatible Regular Expression库,答许多Linux发行版本都带有这个函数库。