最近在读Modern Complier Implementatnion in C.
做到语法分析(syntax analysis)时,发现不知道如何写注释的正则表达式:
以下的正则表达式:
"/*"[.|\n]"*/"
会根据最长匹配原则,将两行注释间的代码当作注释:
/*comments*/
var a = 1
/*comments again*/
第一个/*会和最后一个*/相匹配
以下的正则表达式:
\/\*.*\*\/
会检测不了跨行的注释。
经过搜索发现以下的正则表达式能够成功解决以上两个问题:
"/*"([^*]|\*+[^*/])*\*+"/"
解释一下:
开头是/*,没有问题
对于中间的元素,我们希望其中没有*/,所以我们接受如下两种情况:
1. 不是*的字符,用[^*]匹配
2. 一个或多个*字符,后面跟的字符不是/, 用\*+[^*/]匹配
最后,一个或多个*加上/结束注释
注意,对于中间的情况2,由于前面使用了\*+匹配一个或多个*字符,后面跟的字符在排除/之外,也要排除掉*,否则***也会被匹配到这种情况之中,从而使***和之后可能出现的/分离,不能结束正则表达式。