PowerShell中如何用正则表达式忽略代码行尾的行内注释?
解决方法
要保留带行尾注释的代码行、只过滤纯注释行,你需要修改正则表达式,让它仅匹配整行都是注释的情况,而非行中任意位置的注释。
修改后的正则表达式
^\s*(/\*([^*]|(\*+[^*/]))*\*+/)|^\s*//.*
正则说明
^\s*:匹配行开头的零或多个空白字符(兼容带缩进的注释行)- 第一部分
(/\*([^*]|(\*+[^*/]))*\*+/):匹配整行(含缩进)的块注释(比如/* 这是块注释 */或/* 带缩进的块注释 */) - 第二部分
^\s*//.*:匹配行首(含缩进)开始的单行注释(比如// 这是单行注释或// 带缩进的单行注释)
这个正则只会命中纯注释行,不会匹配代码; // 行尾注释这类混合行,搭配-NotMatch参数时就能保留带行尾注释的代码行。
修改后的PowerShell脚本
$isConstantFile = [bool]($fileContent | Select-String -Pattern "\bConstants.cs\b" | Select-String -Pattern $dirPattern | ForEach-Object{ Get-Content $_ | Select-String -Pattern $filePattern | Select-String -Pattern "^\s*(/\*([^*]|(\*+[^*/]))*\*+/)|^\s*//.*" -NotMatch -Quiet # 仅过滤纯注释行 })
补充说明
如果代码里存在跨多行的块注释(比如块注释占了连续多行),按行读取的方式无法过滤块注释的中间行。这种情况可以改用Get-Content -Raw将文件作为整体读取,先替换掉所有块注释后再处理单行注释,但会改变原有的行结构,需根据实际需求调整。
内容的提问来源于stack exchange,提问作者HappyQuest
相关产品推荐
相关产品推荐

