欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Ubuntu中文論壇 ? 查看主題 - 我實(shí)在用不好 regex(C正則表達式庫)了, 求達人幫忙!
我實(shí)在用不好 regex(C正則表達式庫)了, 求達人幫忙!
發(fā)表于 : 2010-03-03 22:20
注冊: 2009-05-20 21:43
帖子: 625 我的示例代碼如下, 提取并輸出一個(gè)字符串中以逗號或分號分隔的單詞列表:
代碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <regex.h>
int main(int argc, char** argv)
{
int i = 0;
int res;
int len;
char result[BUFSIZ];
char err_buf[BUFSIZ];
char* src = argv[1];   /* 源由命令行參數指定 */
const char* pattern = "\\<[^,;]+\\>";
regex_t preg;
regmatch_t pmatch[10];
if( (res = regcomp(&preg, pattern, REG_EXTENDED)) != 0)
{
regerror(res, &preg, err_buf, BUFSIZ);
printf("regcomp: %s\n", err_buf);
exit(res);
}
res = regexec(&preg, src, 10, pmatch, REG_NOTBOL);
//~ res = regexec(&preg, src, 10, pmatch, 0);
//~ res = regexec(&preg, src, 10, pmatch, REG_NOTEOL);
if(res == REG_NOMATCH)
{
printf("NO match\n");
exit(0);
}
for (i = 0; pmatch[i].rm_so != -1; i++)
{
len = pmatch[i].rm_eo - pmatch[i].rm_so;
memcpy(result, src + pmatch[i].rm_so, len);
result[len] = 0;
printf("num %d: '%s'\n", i, result);
}
regfree(&preg);
return 0;
}
可是結果并非我意料, 僅能輸出第一個(gè)匹配的單詞...
如: gcc -o regex regex.c;
./regex 'hello, world'
輸出為 num 0: 'hello'
而我預期的結果應為:
num 0: 'hello'
num 1: 'world'
到底問(wèn)題出在那里, 懇請達人幫助! 謝謝!!!
最后由瀟灑走一回 編輯于 2010-03-04 19:58,總共編輯了 3 次
頁(yè)首
3 樓 den  文章標題 : Re: 我實(shí)在用不好 regex(C正則表達式庫)了, 求達人幫忙!
發(fā)表于 : 2010-03-04 22:43
注冊: 2007-06-15 21:19
帖子: 194
地址: 上海 regexec只會(huì )匹配一次,需要自己手動(dòng)寫(xiě)循環(huán)來(lái)匹配多個(gè)。
pmatch是用來(lái)存儲一次匹配產(chǎn)生的多組數據的,只要把你的pattern改成 "\\<(.)([^,;]+)\\>" ,就能看出來(lái)了。
_________________
/****************************************************
/* Work hard, play harder.
/****************************************************
頁(yè)首  
4 樓 瀟灑走一回  文章標題 : Re: 我實(shí)在用不好 regex(C正則表達式庫)了, 求達人幫忙!
發(fā)表于 : 2010-03-04 23:41
注冊: 2009-05-20 21:43
帖子: 625 den 寫(xiě)道:
regexec只會(huì )匹配一次,需要自己手動(dòng)寫(xiě)循環(huán)來(lái)匹配多個(gè)。
pmatch是用來(lái)存儲一次匹配產(chǎn)生的多組數據的,只要把你的pattern改成 "\\<(.)([^,;]+)\\>" ,就能看出來(lái)了。
我知道你說(shuō)的意思了... 首先萬(wàn)分感謝!
可 是那樣也太麻煩了吧? 循環(huán)匹配倒不算什么... 經(jīng)我測試, 要想在一個(gè)字符串匹配多個(gè)結果, 每次匹配到一個(gè)結果后 需要把已經(jīng)匹配的子串摘掉 才能在剩下的字符串繼續尋找匹配(不要妄想regexec會(huì )記住上次匹配的位置)... 比如說(shuō): 在 "lily, lucy, kate" 中匹配出lily后, 再次調用regexec它還會(huì )從開(kāi)頭匹配, 所以必須把第一個(gè)匹配結果移除...
頁(yè)首  
5 樓 瀟灑走一回  文章標題 : Re: 我實(shí)在用不好 regex(C正則表達式庫)了, 求達人幫忙!
發(fā)表于 : 2010-03-05 0:28
注冊: 2009-05-20 21:43
帖子: 625 感謝 den ?。?! 在他的指點(diǎn)下我破除了網(wǎng)上那些文章的誤導, 基本搞懂了 regex 的用法! 下面貼出我重寫(xiě)的小示例, 目的在于演示 linux C 中如何使用 regex 正則表達式 。。。我之所以寫(xiě)的這么啰嗦, 是希望有人通過(guò)google搜索時(shí), 他所使用的關(guān)鍵字能被google 定位到這里來(lái)。。。
代碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <regex.h>
int main(int argc, char** argv)
{
int i = 0;
int res;
int sub_len;
int cut_here;   /* 是一個(gè)位置標記 */
char result[BUFSIZ];
char err_buf[BUFSIZ];
char* src = argv[1];   /* 源由命令行參數指定 */
const char* pattern = "[+-](\\<[^,;]+\\>)";
regex_t preg;
regmatch_t pmatch[10];
if( (res = regcomp(&preg, pattern, REG_EXTENDED)) != 0)
{
regerror(res, &preg, err_buf, BUFSIZ);
printf("regcomp: %s\n", err_buf);
exit(res);
}
while(1)
{
res = regexec(&preg, src, 10, pmatch, 0);
if(res == REG_NOMATCH)
{
break;
}
for (i = 0; pmatch[i].rm_so != -1; i++)
{
sub_len = pmatch[i].rm_eo - pmatch[i].rm_so;
memcpy(result, src + pmatch[i].rm_so, sub_len);
result[sub_len] = 0;
if(i == 0)
{
cut_here = pmatch[0].rm_eo;
/* 下次匹配前src將從此處被截斷 */
printf("'%s' 成功被匹配, ", result);
}
else
printf("其實(shí)我想要的是其中的 '%s' .", result);
}
putchar('\n');
src += cut_here;
/* 在src 中 "砍掉" 已經(jīng)匹配的子串 */
}
regfree(&preg);
return 0;
}
編譯: gcc -o regex regex.c
執行: ./regex '+happy, -sorrow'
輸出: 引用:
'+happy' 成功被匹配, 其實(shí)我想要的是其中的 'happy' .
'-sorrow' 成功被匹配, 其實(shí)我想要的是其中的 'sorrow' .
再次感謝 den!!!
頁(yè)首  
6 樓 alober  文章標題 : Re: 我實(shí)在用不好 regex(C正則表達式庫)了, 求達人幫忙!
發(fā)表于 : 2010-07-13 17:22
注冊: 2010-07-13 17:04
帖子: 1 我想用下邊這段進(jìn)行惰性匹配,但匹配出了This is,我只想匹配出This,應該怎么寫(xiě)呢?望各位老大指點(diǎn)。
代碼:
const char *pattern = "(.*?is).*";
char *text = "This is a book.";
//略去其它聲明
regcomp(&reg, pattern, REG_EXTENDED);
status = regexec(&reg, text, nm, pm, REG_NOTBOL);
if (status == REG_NOMATCH) {
printf("No match.\n");
} else if (status == 0) {
strncpy(dest, text + pm[1].rm_so,
pm[1].rm_eo - pm[1].rm_so);
printf("%s\n", dest);
}
regfree(&reg);
頁(yè)首  
7 樓 瀟灑走一回  文章標題 : Re: 我實(shí)在用不好 regex(C正則表達式庫)了, 求達人幫忙!
發(fā)表于 : 2010-09-06 10:45
注冊: 2009-05-20 21:43
帖子: 625 alober 寫(xiě)道:
我想用下邊這段進(jìn)行惰性匹配,但匹配出了This is,我只想匹配出This,應該怎么寫(xiě)呢?望各位老大指點(diǎn)。
代碼:
const char *pattern = "(.*?is).*";
char *text = "This is a book.";
//略去其它聲明
regcomp(&reg, pattern, REG_EXTENDED);
status = regexec(&reg, text, nm, pm, REG_NOTBOL);
if (status == REG_NOMATCH) {
printf("No match.\n");
} else if (status == 0) {
strncpy(dest, text + pm[1].rm_so,
pm[1].rm_eo - pm[1].rm_so);
printf("%s\n", dest);
}
regfree(&reg);
我好長(cháng)時(shí)間沒(méi)研究正則表達試了...
你的 "(.*?is).*" 我看不大明白 ".*" 后面怎么又是一個(gè)問(wèn)號?
非貪婪匹配我沒(méi)有研究也沒(méi)有需要過(guò), 我對正則表達式的需求并不復雜.
另外, 我轉而使用Boost.Regex了.
最后由瀟灑走一回 編輯于 2010-09-06 10:56,總共編輯了 2 次
頁(yè)首  
8 樓 eexpress  文章標題 : Re: 我實(shí)在用不好 regex(C正則表達式庫)了, 求達人幫忙!
發(fā)表于 : 2010-09-06 10:52
注冊: 2005-08-14 21:55
帖子: 43993
地址: 長(cháng)沙 .*?是最短匹配。表示匹配 xxxxis 而不是 xxxisandis
還有可預見(jiàn)匹配。哎。這都是perl玩的。C里面不痛苦啊,那些匹配前,匹配后,匹配結果等。。。都估計用不上了吧。
引用:
$` 在上個(gè)格式匹配信息前的字符串
$& 與上個(gè)格式匹配的字符串
$’ 在上個(gè)格式匹配信息后的字符串
_________________
居然不認utf8了。
頁(yè)首  
9 樓 瀟灑走一回  文章標題 : Re: 我實(shí)在用不好 regex(C正則表達式庫)了, 求達人幫忙!
發(fā)表于 : 2010-09-06 10:54
注冊: 2009-05-20 21:43
帖子: 625 eexpress 寫(xiě)道:
.*?是最短匹配。表示匹配 xxxxis 而不是 xxxisandis
還有可預見(jiàn)匹配。哎。這都是perl玩的。C里面不痛苦啊,那些匹配前,匹配后,匹配結果等。。。都估計用不上了吧。
引用:
$` 在上個(gè)格式匹配信息前的字符串
$& 與上個(gè)格式匹配的字符串
$’ 在上個(gè)格式匹配信息后的字符串
據說(shuō)Perl正則很強大的, 可惜我沒(méi)學(xué). 你后面里面說(shuō)的三個(gè)規則, Boost.Regex里面支持的很好.
Boost.Regex同時(shí)支持POSIX和Perl的規則 .
頁(yè)首  
10 樓 tusooa  文章標題 : Re: 我實(shí)在用不好 regex(C正則表達式庫)了, 求達人幫忙!
發(fā)表于 : 2010-09-15 22:10
注冊: 2008-10-31 22:12
帖子: 2171 用perl
_________________
決定了:以后再也不用聞到死了。
Bash-Libraries
推薦一下這個(gè)。
圍觀(guān)看帖不回的人。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
C語(yǔ)言正則表達式
專(zhuān)家教您如何在C語(yǔ)言中巧用正則表達式
C語(yǔ)言使用正則表達式
POSIX正則表達式
C語(yǔ)言中嵌入正則表達式
C++中三種正則表達式比較(C regex,C ++regex,boost regex)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久