這裡只是當作自己的**版本管理器使用,並不去詳細介紹**,畢竟我的注釋裡面已經說明了很多。
注意,當前的假定是輸入自己不能有錯誤,而且*、(、)、.、|這幾個操作符是保留字,其他的字元則當作其自身意思。當前不考慮轉義字元及三元組,以及不考慮子表示式命名,因此只能處理乙個長正規表示式。
1 #include 2 #include3 #include 4
//這裡只處理最簡單的正規表示式,即包括括號,星號運算,連線運算和分支運算,這裡分支運算在壓棧是是乙個點號5//
其中括號優先順序最大,其次是星號運算其次是連線運算最後是分支運算6//
當前版本只是把乙個簡單的正規表示式的優先順序理清
7#define strict8//
strict 的意思就是不要求顯示的寫出.運算子 ,因為在缺少這個運算子的情況下,我們還是可以推斷出來這個9//
運算子是存在的 ,例如 在)及 *及非運算子之後如果存在字母則是缺少連線符,我們可以自己加上去
10int is_operator(char
for_in)
1122}23
int main(void)24
38 input_pointer=0
;39 printf("
please type in you regex short phrase\n");
40 scanf("%s"
,reg_input);
41while(*(reg_input+input_pointer)!='\0'
)4254else
5560}61
#endif
6263}64
else
//如果是操作符
6588
else
8994}95
#endif
96break;97
}98else
//如果前面還有運算子,只有可能是連線和選擇運算子
99113
else
114124
125}
126case'*
':127//
這個運算子優先順序基本上是最高的,因此不需要入棧了,直接處理
128 name_number++;
129 printf("
name%d is multiple of name%d\n
",name_number,token[token_pointer-1
]);130 token[token_pointer-1]=name_number;
131 input_pointer++;
132#ifndef strict
133if(!is_operator(*(reg_input+input_pointer)))
134137
else
138143
}144
#endif
145146
break
;147
case'.
':148//
由於*運算子已經被直接處理了,所以只需要考慮其他的三個運算子
149if(reg_operator[reg_operator_pointer-1]=='.'
)150
//如果前面的那個運算子跟當前優先順序相同,則處理前面的那個運算子
151//
這時字元棧要減一
152161
else
162//
其他情況則直接入棧就行,留到下次來判斷優先順序處理
163168
case'|
':169if(reg_operator[reg_operator_pointer-1]!='
(')//
括號另外說
170177
else
178//
這裡處理的是相同優先順序的情況,其實這裡可以與前面的合併的,只不過列印資訊不同
179182 token[token_pointer-2]=name_number;
183 token_pointer--;
184 reg_operator[reg_operator_pointer-1]='|'
;185 input_pointer++;
186break
;187
}188
else
189194
default
: 195 printf("
error\n");
196break
;197
}198
}199
else
//在當前操作符棧中沒有符號的時候
200211
else
212217
}218
#endif
219220
}221
else
222228
}229
}230
}231
if(reg_operator_pointer==1)//
如果全部的輸入都弄完了,可是 操作符棧中還有資料,則輸出
232238
else
239243
}244
}
最初步的正規表示式引擎 生成nfa
這個版本修改了前面版本的兩個個bug。第乙個 識別到字符集的時候,只是將name number加1,卻並不對reg pattern table name number 進行初始化。第二個 識別到假名的時候,並不為他分配乙個name number,而只是在hash表中為其分配乙個表項。現在,當識別到這...
正規表示式初步
正規表示式是乙個特殊的字串行,它能幫助你方便的檢查乙個字串是否與某種模式匹配,python 自1.5版本起增加了re 模組,它提供 perl 風格的正規表示式模式。compile 函式根據乙個模式字串和可選的標誌引數生成乙個正規表示式物件。該物件擁有一系列方法用於正規表示式匹配和替換。1 基本常用的...
MySQL正規表示式初步
你還可以學習 mysql學習精粹 我們知道,在sql之中,可以用 like 這個謂詞 表示式 來進行模糊檢索,並支援 等佔位符.但是,這個模糊檢索的功能有很多限制,簡單來說就是太模糊了。在mysql中提供了 regexp 關鍵字來支援正規表示式,當然,只是一些很簡單的正則啦。首先,我們構造一些測試資...