如何编写正则表达式匹配无前置注释的class声明?
匹配无前置注释的类声明正则方案
多数编程语言中,注释分为单行注释(//)和多行注释(/* */)两类,且要求注释需紧邻类声明之前、无额外空行。目前需要编写正则表达式,专门匹配没有前置注释的类声明,而现有正则是用来匹配带前置注释的类,需要调整逻辑。
现有正则(匹配带前置注释的类)
(\/\/[^\n]*|\/\*([^\*]|\*[^\/])*\*\/)\n((.*)?(class))
匹配目标
应被匹配的类声明
public class A {} private final class B {} private class C {} public final class D {}
不应被匹配的类声明
// Single line comment private final class B {} /* Multiline comment */ public class B {}
解决方案正则
要实现只匹配无前置注释的类,核心是用反向否定预查,排除掉前面紧跟注释的类声明。推荐正则如下:
(?:^|\n)(?!(\/\/[^\n]*|\/\*([^*]|\*[^\/])*\*\/)\n)\s*(public|private|protected|final|static)?\s*\bclass\b
正则逻辑解释
(?:^|\n):匹配文本开头或换行,定位到类声明行的起始位置(?!(\/\/[^\n]*|\/\*([^*]|\*[^\/])*\*\/)\n):反向否定预查,确保当前位置的前一行不是单行/多行注释(排除带前置注释的情况)\s*:匹配类声明前可能存在的缩进或空白字符(public|private|protected|final|static)?:匹配类的可选修饰符(覆盖常见的类修饰场景)\s*\bclass\b:精准匹配完整的class关键字,避免误匹配包含class的字符串
内容的提问来源于stack exchange,提问作者najm
相关产品推荐
相关产品推荐

