最初步的正規表示式引擎

2022-03-15 18:58:15 字數 2821 閱讀 9911

這裡只是當作自己的**版本管理器使用,並不去詳細介紹**,畢竟我的注釋裡面已經說明了很多。

注意,當前的假定是輸入自己不能有錯誤,而且*、(、)、.、|這幾個操作符是保留字,其他的字元則當作其自身意思。當前不考慮轉義字元及三元組,以及不考慮子表示式命名,因此只能處理乙個長正規表示式。

1 #include 2 #include 

3 #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 關鍵字來支援正規表示式,當然,只是一些很簡單的正則啦。首先,我們構造一些測試資...