最近在讀Modern Complier Implementatnion in C.
做到語法分析(syntax analysis)時,發現不知道如何寫注釋的正則表達式:
以下的正則表達式:
"/*"[.|\n]"*/"
會根據最長匹配原則,將兩行注釋間的代碼當作注釋:
/*comments*/
var a = 1
/*comments again*/
第一個/*會和最后一個*/相匹配
以下的正則表達式:
\/\*.*\*\/
會檢測不了跨行的注釋。
經過搜索發現以下的正則表達式能夠成功解決以上兩個問題:
"/*"([^*]|\*+[^*/])*\*+"/"
解釋一下:
開頭是/*,沒有問題
對於中間的元素,我們希望其中沒有*/,所以我們接受如下兩種情況:
1. 不是*的字符,用[^*]匹配
2. 一個或多個*字符,后面跟的字符不是/, 用\*+[^*/]匹配
最后,一個或多個*加上/結束注釋
注意,對於中間的情況2,由於前面使用了\*+匹配一個或多個*字符,后面跟的字符在排除/之外,也要排除掉*,否則***也會被匹配到這種情況之中,從而使***和之后可能出現的/分離,不能結束正則表達式。