實現正規表示式處理功能

2021-04-22 18:56:42 字數 1339 閱讀 8766

在介紹正規表示式之前,我先說一下有限自動機的概念,呃,先舉個例子吧,請看**:

#include

#include

using namespace std;

enum tokentype

;int dfa_table[37] = , // s0 -- 起始狀態

, // s1 -- 到這裡說明是數字

, // s2 -- 變數

, // s4 -- 這是if

};//

// match:

// 給定乙個字串str,判斷這個字串的型別

// // 例子:

// if, 返回if

// 數字,返回number

// 變數,返回identifier

// tokentype match(string str)

else if (c >= 'a' && c <= 'z')

else

state = dfa_table[state][index];

if (state == boom_error)

break;

}return (tokentype)state;

}int g_line = 0;

void print(tokentype type)

}int main()

例子1:乙個簡單的dfa表驅動匹配程式

上面的例子裡,字串的匹配或者說是分類是通過有限自動機來完成的,有限自動機在**裡面的表示就是那個二維陣列 dfa_table。dfa_table的每一行(dfa_table[i])表示有限自動機的狀態,而列表示從當前狀態可以執行的狀態轉換(transfer)。例如在匹配的時候,程式先從dfa_table[0],也就是起始狀態開始,如果第乙個字串是i,則根據dfa_table[0]['i']指定的轉換規則跳轉到下乙個狀態(state)去,這裡下乙個狀態是2,也就是dfa_table的第三行,再根據str的下乙個字元來確定要轉換的狀態。匹配過程一直迴圈到字串被全部處理掉,這時程式判斷當前的狀態是不是乙個可以接受的狀態(acceptable state),也就是說這個狀態是否在tokentype中定義,如果狀態在tokentype中定義,那好,我們給出的字串匹配成功,否則……boom。

我在match函式的for迴圈中用了if判斷來根據當前的字元選擇正確的索引,其實如果你不嫌麻煩的話,你的match函式中的for迴圈可以簡化成這樣:

for (string::iterator iter = str.begin();

iter != str.end();

++iter )

前提是願意把dfa_table擴充套件成乙個127 * 5的二維**。

未完待續……

RegexKitLite實現正規表示式

可以使用第三方工具 regexkitlite 來實現正規表示式。1regexkitlite 類庫,regexkitlite 將regexkitlite.h regexkitlite.m 兩個檔案新增到您的專案中 2 在您的工程中新增 libicucore.dylib frameworks 3 在您要...

c 實現正規表示式匹配

c 11之後封裝了自己的正規表示式,直接包含檔案即可使用,利用regex類宣告物件初始化正規表示式,regex expressionname 正規表示式 正規表示式具體語法參考這裡 regex match 方法進行匹配,匹配成功返回1,失敗返回0 cmatch和smatch類分別存放char 和st...

java實現正規表示式判斷日期

import apache.oro.text.regex.patternmatcher import apache.oro.text.regex.perl5matcher import apache.oro.text.regex.pattern piler import apache.oro.tex...