下面給出C注釋正則式與自動機相互轉換的例子。兩個例子都不考慮注釋標識符在字符串常量中的情形(如:const char* start = "/*", *end = "*/";)。
自動機轉換成正則式:
識別C注釋的自動機很容易畫出來(^/*表示除'/'及'*'以外的所有字符):
圖1
TMS_LI的正則為:/\*[^*]*\*(\*|[^/*][^*]*\*)*/
正則式轉換成自動機:
參考了一下Mastering Regular Expressions, 3rd Edition By Jeffrey E. F. Friedl,其中 6.7節有提到C注釋正則式匹配問題。沒有仔細看他的推導過程,反正蠻啰嗦。www.linuxidc.com 下面是Jeffrey 給的正則式:
/\*[^*]*\*+([^/*][^*]*\*+)*/
為驗證其正確性,必須正則式轉換成自動機。
圖2
顯然,這兩個自動機是等價的。這也驗證了這兩個正則式的正確性。