匹配 Java/Kotlin 中所有注释的正则表达式

2021-09-19  本文已影响0人  Vic_wkx

第一种

/\*([^*]|(\*+([^*/])))*\*+/|[ \t]*//.*

测试如下:

第一种正则匹配注释

原理

首先处理 /***/ 注释

/\* 表示 /* 开头,\*/ 表示 */ 结尾。

中间分别处理了不包含 * 的情况和包含 * 的情况:

* 为划分依据的原因是:当出现 * 时,如果后续跟了一个 /,则需要停止匹配。

中间这个部分可能有 0 个或者多个,所以用 * 号修饰中间部分出现的次数:([^*]|(\*+([^*/])))*

然后处理 // 注释

第二种

/\*((?!\*/).|[\r\n])*?\*/|[ \t]*//.*

测试如下:

第二种正则匹配注释

原理

首先处理 /***/ 注释

中间的内容可以有 0 个或者 多个,所以给 ((?!\*/).|[\r\n]) 加上 * 号。为了不过多匹配,导致到达 */ 时仍然无法终止,所以我们给这一段加上? 表示非贪婪匹配 。

然后处理 // 注释

[ \t]*//.* 表示匹配 // 注释,前方可能有多个空格或制表符。

注:细心的读者可能注意到了,这两种匹配方式都无法处理 /** /** */*/ 这样的嵌套注释,虽然我们一般不会写这样的嵌套注释,并且这类注释在 Java 中无法编译通过,但这类注释在 Kotlin 中是合法的,此问题笔者暂未找到合适的解决方案,如果读者有更好的正则匹配方案,望不吝赐教。

上一篇 下一篇

猜你喜欢

热点阅读