国产久操视频-国产久草视频-国产久热精品-国产久热香蕉在线观看-青青青青娱乐-青青青青在线成人视99

  • 正文
  • 推薦器件
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

2 個小例子了解 C 語言使用正則表達式

2023/04/20
1198
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

哈嘍,我是老吳。我的日常工作基本離不開正則表達式,不過一般是在 Shell 腳本或者命令行里使用。今天抽空了解了一下 C 語言下的使用方式,馬上分享給大家。如果你還不了解正則表達式,可以先瞅一眼 《Linux Shell 腳本攻略》第 4.2 章節(jié)正則表達式入門。

五分鐘就可以入門,下面來看第一個例子。

#include?<regex.h>

static?const?char?*const?str?=
???????"1)?John?Driverhacker;n2)?John?Doe;n3)?John?Foo;n";
static?const?char?*const?re?=?"John.*o";

int?main(void)
{
???static?const?char?*s?=?str;
???regex_t?????regex;
???regmatch_t??pmatch[1];
???regoff_t????off,?len;

???if?(regcomp(&regex,?re,?REG_NEWLINE))
???????exit(EXIT_FAILURE);

???printf("Matches:n");
???for?(int?i?=?0;?;?i++)?{
???????if?(regexec(&regex,?s,?ARRAY_SIZE(pmatch),?pmatch,?0))
???????????break;

???????off?=?pmatch[0].rm_so?+?(s?-?str);
???????len?=?pmatch[0].rm_eo?-?pmatch[0].rm_so;
???????printf("#%d:n",?i);
???????printf("offset?=?%jd;?length?=?%jdn",?(intmax_t)?off,
???????????????(intmax_t)?len);
???????printf("substring?=?"%.*s"n",?len,?s?+?pmatch[0].rm_so);

???????s?+=?pmatch[0].rm_eo;
???}
}

運行結(jié)果:

$?./example?
Matches:
#0:
offset?=?25;?length?=?7
substring?=?"John?Do"
#1:
offset?=?38;?length?=?8
substring?=?"John?Foo"

成功匹配出符合 "John.*o" 表達式的兩個字符串。
一般正則表達式相關(guān)的接口就是 2 個:
1、編譯,對應(yīng) regcomp();2、查找匹配項,對應(yīng) regexec();匹配到的結(jié)果會保存在結(jié)構(gòu)體 regmatch_t 里,注意,這個結(jié)構(gòu)體里只保存了匹配項的 start offset 和 end offset。

typedef?struct?{
????regoff_t?rm_so;
????regoff_t?rm_eo;
}?regmatch_t;

如果你的系統(tǒng)不是 Linux,而是嵌入式 RTOS 或者裸機程序,可以使用這個開源的正則表達式庫:

https://github.com/kokke/tiny-regex-c

tiny-regex-c 是一個有 1K star 的超小巧 C 語言 regex 庫。源碼就 2 個文件:re.c 和 re.h,超容易移植。用法看這個例子:

#include?"re.h"

int?main(void)
{
????/*?Standard?int?to?hold?length?of?match?*/
????int?match_length;

????/*?Standard?null-terminated?C-string?to?search:?*/
????const?char*?string_to_search?=?"ahem..?'hello?world?!'?..";

????/*?Compile?a?simple?regular?expression?using?character?classes,?meta-char?and?greedy?+?non-greedy?quantifiers:?*/
????re_t?pattern?=?re_compile("[Hh]ello?[Ww]orlds*[!]?");

????/*?Check?if?the?regex?matches?the?text:?*/
????int?match_idx?=?re_matchp(pattern,?string_to_search,?&match_length);
????if?(match_idx?!=?-1)?{
????????printf("match:?%sn",?string_to_search?+?match_idx);
????}
}

運行結(jié)果:

match:?hello?world?!'?..

tiny-regex-c 的 接口和 第一個例子 的posix regex 類似,都是一目了然,就不再贅述了。

—— The End ——

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風(fēng)險等級 參考價格 更多信息
HFBR-2406Z 1 Broadcom Limited Receiver, 160Mbps, SMA Connector, Through Hole Mount, ROHS COMPLIANT, PLASTIC, 8 PIN
$13.31 查看
NC7SZ08M5X 1 onsemi TinyLogic UHS 2-Input AND Gate, 3000-REEL

ECAD模型

下載ECAD模型
$0.15 查看
CPC1510GSTR 1 IXYS Corporation Transistor Output SSR, 1-Channel, 3750V Isolation, SURFACE MOUNT PACKAGE-6
$2.3 查看

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄
澳门| 衡东县| 休宁县| 杭州市| 佛山市| 和林格尔县| 屏东市| 丰县| 富阳市| 廊坊市| 大冶市| 广平县| 西安市| 南漳县| 利川市| 柞水县| 苏尼特右旗| 买车| 雷山县| 宁强县| 清水河县| 花莲县| 长岛县| 克什克腾旗| 安吉县| 永春县| 加查县| 深圳市| 日土县| 铁力市| 基隆市| 蓬溪县| 犍为县| 大冶市| 云龙县| 甘南县| 宁海县| 华蓥市| 孝义市| 大余县| 菏泽市|