注釋的正則表達式


最近在讀Modern Complier Implementatnion in C.

做到語法分析(syntax analysis)時,發現不知道如何寫注釋的正則表達式:

以下的正則表達式:

"/*"[.|\n]"*/"

會根據最長匹配原則,將兩行注釋間的代碼當作注釋:

/*comments*/

var a = 1

/*comments again*/

第一個/*會和最后一個*/相匹配

 

以下的正則表達式:

\/\*.*\*\/

會檢測不了跨行的注釋。

 

經過搜索發現以下的正則表達式能夠成功解決以上兩個問題:

"/*"([^*]|\*+[^*/])*\*+"/"

解釋一下:

開頭是/*,沒有問題

對於中間的元素,我們希望其中沒有*/,所以我們接受如下兩種情況:

1. 不是*的字符,用[^*]匹配

2. 一個或多個*字符,后面跟的字符不是/, 用\*+[^*/]匹配

最后,一個或多個*加上/結束注釋

注意,對於中間的情況2,由於前面使用了\*+匹配一個或多個*字符,后面跟的字符在排除/之外,也要排除掉*,否則***也會被匹配到這種情況之中,從而使***和之后可能出現的/分離,不能結束正則表達式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM