Ⅰ 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發行版本都帶有這個函數庫。