注释的正则表达式

最近在读Modern Complier Implementatnion in C.

做到语法分析(syntax analysis)时,发现不知道如何写注释的正则表达式:

以下的正则表达式:

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

会根据最长匹配原则,将两行注释间的代码当作注释:

/*comments*/

var a = 1

/*comments again*/

第一个/*会和最后一个*/相匹配

 

以下的正则表达式:

\/\*.*\*\/

会检测不了跨行的注释。

 

经过搜索发现以下的正则表达式能够成功解决以上两个问题:

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

解释一下:

开头是/*,没有问题

对于中间的元素,我们希望其中没有*/,所以我们接受如下两种情况:

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

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

最后,一个或多个*加上/结束注释

注意,对于中间的情况2,由于前面使用了\*+匹配一个或多个*字符,后面跟的字符在排除/之外,也要排除掉*,否则***也会被匹配到这种情况之中,从而使***和之后可能出现的/分离,不能结束正则表达式。

上一篇:又拍网数据库架构案例分析


下一篇:2021-07-22