當前位置:首頁 » 編程語言 » c語言正則庫
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言正則庫

發布時間: 2022-06-22 20:24:38

Ⅰ 有沒有開源的c語言實現的正則表達式

正則表達式 是一門數學應用到計算機中的表達式。不是專屬於哪種語言,現在各大主流語言都可以通過標准庫 或者 模塊 或者函數調用正則表達式。

包括 C C++ PYTHON ruby PHP ASP等等

下面貼出一段C語言 使用正則表達式的例子

1#include<stdio.h>
2#include<sys/types.h>
3#include<regex.h>
4#include<memory.h>
5#include<stdlib.h>
6
7intmain(){
8
9char*bematch="[email protected]";
10char*pattern="h{3,10}(.*)@.{5}.(.*)";
11charerrbuf[1024];
12charmatch[100];
13regex_treg;
14interr,nm=10;
15regmatch_tpmatch[nm];
16
17if(regcomp(&reg,pattern,REG_EXTENDED)<0){
18regerror(err,&reg,errbuf,sizeof(errbuf));
19printf("err:%s ",errbuf);
20}
21
22err=regexec(&reg,bematch,nm,pmatch,0);
23
24if(err==REG_NOMATCH){
25printf("nomatch ");
26exit(-1);
27}elseif(err){
28regerror(err,&reg,errbuf,sizeof(errbuf));
29printf("err:%s ",errbuf);
30exit(-1);
31}
32
33for(inti=0;i<10&&pmatch[i].rm_so!=-1;i++){
34intlen=pmatch[i].rm_eo-pmatch[i].rm_so;
35if(len){
36memset(match,'',sizeof(match));
37memcpy(match,bematch+pmatch[i].rm_so,len);
38printf("%s ",match);
39}
40}
41return0;
42}

Ⅱ 除了pcre,支持linux c語言的正則表達式庫有哪些

REEC我沒用過,我平時用的是#include <regex.h>
原來寫過一個代碼例子在csdn上面,C 和C++都能用
http://download.csdn.net/detail/ace_fei/4722736

Ⅲ 推薦個c語言可用的正則庫,在windows 下編譯,編譯的二進制不需要動態鏈接庫就能運行的,有嗎

網頁鏈接

這個,有源碼,想編譯成dll或靜態庫都行

Ⅳ C語言如何使用正則表達式

using System.Text.RegularExpressions;
Regex reg = new Regex(@"你的正則表達式");
reg.IsMatch(@"返回Bool值,是否匹配");
reg.Match(@"返回一個匹配");
reg.Matches(@"返回所有匹配");

Ⅳ 如何在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語言 正則庫 pcre 教程 (windows環境)

1、編譯PCRE正則表達式庫

(1) (MinGW + MSYS)

將PCRE源碼包直接拷貝到MSYS目錄下,(如:C:\MSYS\1.0\pcre\)

運行msys.bat啟動MSYS,

在命令行輸入

cd / // 回根目錄

cd pcre // 進入PCRE目錄

./configure // 配置編譯

make // 編譯全部

完成後,會在C:\MSYS\1.0\pcre\.libs\ 下生成所需要的文件:

libpcre-0.dll // PCRE的動態鏈接庫

libpcre.dll.a // 調用PCRE動態鏈接庫所用的LIB

libpcre.a // PCRE靜態鏈接庫

再配合上C:\MSYS\1.0\pcre\目錄下的"pcre.h",就可以在程序中加入正則表達式支持了:)

(2) (於windows平台手動編譯pcre,轉載)

將 config.h.generic 重命名為 config.h
設置其中的 HAVE_BCOPY 參數為 0 (因為windows平台無b()函數)
重命名 pcre.h.generic 為 pcre.h.
重命名 pcre_chartables.c.dist 為 pcre_chartables.c.
編譯 dftables.c 成可執行文件,要加入參數 -DHAVE_CONFIG_H,以便導入 config.h 文件中的設置
/* 重命名 pcre_chartables.c.dist 為 pcre_chartables.c */
運行編譯的可執行文件 dftables.exe ,參數為 pcre_chartables.c
即 dftables.exe pcre_chartables.c
新建工程,包含下列文件,編譯成lib文件即可
pcre_internal.h
ucp.h
ucpinternal.h
ucptable.h
pcre_chartables.c
pcre_compile.c
pcre_config.c
pcre_dfa_exec.c
pcre_exec.c
pcre_fullinfo.c
pcre_get.c
pcre_globals.c
pcre_info.c
pcre_maketables.c
pcre_newline.c
pcre_ord2utf8.c
pcre_refcount.c
pcre_study.c
pcre_tables.c
pcre_try_flipped.c
pcre_ucp_searchfuncs.c
pcre_valid_utf8.c
pcre_version.c
pcre_xclass.c

這樣就可以生成 libpcre.a 文件了 (vc,bcc生成的是pcre.lib,大同小異)

2、使用生成的 libpcre.a (靜態鏈接庫)

在你的程序中添加:

#define PCRE_STATIC // 開啟靜態鏈接庫支持(一定要添加該行,否則無法使用靜態鏈接庫)
#include "pcre.h" // PCRE頭文件
並且添加 libpcre.a 到工程中,然後就可以在程序中使用PCRE函數了:)

編譯選項 添加 /MT ,無頭文件預編譯.

3、使用生成的 libpcre-0.dll 和 libpcre.dll.a (動態鏈接庫)

在你的程序中添加:

#include "pcre.h" // PCRE頭文件

並且添加 libpcre.dll.a 到工程中,然後就可以在程序中使用PCRE函數了:)

================================================================================

命令行下的批處理解決方法 .如果已經下載,可以不用第一行.

goto START

首先確保控制台環境中有:
1、VC6命令行編譯環境
2、wget.exe、unzip.exe、sed.exe、mv.exe
然後執行這個批處理文件,就可以得到VC版本的pcr.lib。

:START
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.7.zip
unzip pcre-7.7.zip
cd pcre-7.7
sed -e "s/#define HAVE_BCOPY 1/#define HAVE_BCOPY 0/g" config.h.generic > config.h
mv pcre.h.generic pcre.h
mv pcre_chartables.c.dist pcre_chartables.c
cl -MD -DHAVE_CONFIG_H dftables.c
dftables.exe pcre_chartables.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_chartables.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_compile.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_config.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_dfa_exec.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_exec.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_fullinfo.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_get.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_globals.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_info.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_maketables.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_newline.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_ord2utf8.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_refcount.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_study.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_tables.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_try_flipped.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_ucp_searchfuncs.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_valid_utf8.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_version.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_xclass.c
lib -out:libpcr.lib pcre_chartables.obj pcre_compile.obj pcre_config.obj pcre_dfa_exec.obj pcre_exec.obj pcre_fullinfo.obj pcre_get.obj pcre_globals.obj pcre_info.obj pcre_maketables.obj pcre_newline.obj pcre_ord2utf8.obj pcre_refcount.obj pcre_study.obj pcre_tables.obj pcre_try_flipped.obj pcre_ucp_searchfuncs.obj pcre_valid_utf8.obj pcre_version.obj pcre_xclass.obj

這樣就出來了: pcre.h + libpcr.lib

==============================================================================

最近使用VC編譯了一下她的源代碼,其實步驟很簡單, 如下

1 一些源文件改名
config.h.generic 改名為 config.h (注意裡面的配置)
pcre.h.generic 改名為 pcre.h
pcre_chartables.c.dist 改名為 pcre_chartables.c

2 建立VC工程
建立一個VC的DLL工程,去掉原有的包含文件
將PCRE的所有pcre_*.c都加進去, pcre後面沒有_的不要加, 後綴名是.cc的不要加
可以參考上面的.還有.h 文件也是要的.

3 修改工程設置

增加工程預編譯宏 HAVE_CONFIG_H
不使用預編譯頭 Not Using Precompiled Headers
編譯選項 添加 /MT

OK 完成以上三步,就可以在 VC 上編譯通過了。

4 編譯結果
使用時只需要編譯出來的 .DLL .Lib 和 源代碼目錄的 pcre.h

Ⅷ C語言怎麼用正則表達式

如何在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()將其釋放,以免產生內存泄漏。

void regfree(regex_t *preg);

函數regfree()不會返回任何結果,它僅接收一個指向regex_t數據類型的指針,這是之前調用regcomp()函數所得到的編譯結果。

如果在程序中針對同一個regex_t結構調用了多次regcomp()函數,POSIX標准並沒有規定是否每次都必須調用regfree()函
數進行釋放,但建議每次調用regcomp()函數對正則表達式進行編譯後都調用一次regfree()函數,以盡早釋放佔用的存儲空間。

報告錯誤信息

如果調用函數regcomp()或regexec()得到的是一個非0的返回值,則表明在對正則表達式的處理過程中出現了某種錯誤,此時可以通過調用函數regerror()得到詳細的錯誤信息。

size_t regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size);

參數errcode是來自函數regcomp()或regexec()的錯誤代碼,而參數preg則是由函數regcomp()得到的編譯結果,
其目的是把格式化消息所必須的上下文提供給regerror()函數。在執行函數regerror()時,將按照參數errbuf_size指明的最大字
節數,在errbuf緩沖區中填入格式化後的錯誤信息,同時返回錯誤信息的長度。

應用正則表達式

最後給出一個具體的實例,介紹如何在C語言程序中處理正則表達式。

#include <stdio.h>;
#include <sys/types.h>;
#include <regex.h>;

/* 取子串的函數 */
static char* substr(const char*str, unsigned start, unsigned end)
{
unsigned n = end - start;
static char stbuf[256];
strncpy(stbuf, str + start, n);
stbuf[n] = 0;
return stbuf;
}
/* 主程序 */
int main(int argc, char** argv)
{
char * pattern;
int x, z, lno = 0, cflags = 0;
char ebuf[128], lbuf[256];
regex_t reg;
regmatch_t pm[10];
const size_t nmatch = 10;
/* 編譯正則表達式*/
pattern = argv[1];
z = regcomp(®, pattern, cflags);
if (z != 0){
regerror(z, ®, ebuf, sizeof(ebuf));
fprintf(stderr, "%s: pattern '%s' \n", ebuf, pattern);
return 1;
}
/* 逐行處理輸入的數據 */
while(fgets(lbuf, sizeof(lbuf), stdin)) {
++lno;
if ((z = strlen(lbuf)) >; 0 && lbuf[z-1] == '\n')
lbuf[z - 1] = 0;
/* 對每一行應用正則表達式進行匹配 */
z = regexec(®, lbuf, nmatch, pm, 0);
if (z == REG_NOMATCH) continue;
else if (z != 0) {
regerror(z, ®, ebuf, sizeof(ebuf));
fprintf(stderr, "%s: regcom('%s')\n", ebuf, lbuf);
return 2;
}
/* 輸出處理結果 */
for (x = 0; x < nmatch && pm[x].rm_so != -1; ++ x) {
if (!x) printf("%04d: %s\n", lno, lbuf);
printf(" $%d='%s'\n", x, substr(lbuf, pm[x].rm_so, pm[x].rm_eo));
}
}
/* 釋放正則表達式 */
regfree(®);
return 0;
}

上述程序負責從命令行獲取正則表達式,然後將其運用於從標准輸入得到的每行數據,並列印出匹配結果。執行下面的命令可以編譯並執行該程序:

# gcc regexp.c -o regexp
# ./regexp 'regex[a-z]*' < regexp.c
0003: #include <regex.h>;
$0='regex'
0027: regex_t reg;
$0='regex'
0054: z = regexec(®, lbuf, nmatch, pm, 0);
$0='regexec'

小結

對那些需要進行復雜數據處理的程序來說,正則表達式無疑是一個非常有用的工具。本文重點在於闡述如何在C語言中利用正則表達式來簡化字元串處理,以便在數據處理方面能夠獲得與Perl語言類似的靈活性。

Ⅸ C語言應該用什麼樣的正則表達式庫

1、標準的C和C++都不支持正則表達式,但有一些函數庫可以輔助C/C++程序員完成這一功能,其中最著名的當數Philip Hazel的Perl-Compatible Regular Expression庫,許多Linux發行版本都帶有這個函數庫。 2、C/C++ 中使用正則表達式一般分為三步: 1...

Ⅹ C語言的正則表達式相關提問。

prce是著名的開源正則庫,源碼是C。包括php,perl,python等語言都在直接或間接使用該庫。

pcre *re 指向整個庫對象或結構體的指針,
pcre 意思Perl Compatible Regular Expressions,perl語言兼容型正則(庫)
re意思regular expression正則

頭文件、源碼去pcre官網下載。
頭文件的詳解,就要看文檔,學習調用和使用該庫。
文檔都寫著。

另外這個庫是為開發者准備的正則中間件,嵌入程序中,使程序能解析正則。
不是專為正則的初學者練習正則而設置。學習文檔會不少,
需要熟練整個c庫操作流程和常用原理後直接去看源碼。