正则表达式:如何匹配子分组以精准提取代码注释?
解决正则匹配单个C#注释的问题
嘿,这个坑我之前踩过好多次!你遇到的是正则表达式里的贪婪匹配陷阱,这也是新手用正则处理注释时最常犯的错误之一。
为什么你的正则会“跑偏”?
你写的\/\*(.*)\*\/里,.*是贪婪量词——它会尽可能匹配最多的字符,从第一个/*开始一路“吃”到最后一个*/才肯停下,自然就把中间的*/ using System;/*也给包进去了,结果就变成匹配一整段而非单个注释。
正确的正则写法
只需要把贪婪匹配改成非贪婪匹配,在.*后面加个?就行:
\/\*(.*?)\*\/
.*?会尽可能匹配最少的字符,遇到第一个*/就停止匹配,这样就能精准捕获每一个独立的注释块了。
实际使用示例(以C#为例)
假设你的输入字符串是:
/* pierwszy */ using System;/* drugi */
用C#的正则类来匹配:
using System; using System.Text.RegularExpressions; var input = "/* pierwszy */ using System;/* drugi */"; var matches = Regex.Matches(input, @"\/\*(.*?)\*\/"); foreach (Match match in matches) { Console.WriteLine($"整个注释块:{match.Value}"); Console.WriteLine("注释内容:" + match.Groups[1].Value); // 这里就是你要的子分组内容 }
运行后会输出两个独立的注释,而不是一整段。
额外注意:处理带换行的注释
如果你的注释里包含换行符,默认的.不会匹配换行,这时候可以用两种方法解决:
- 添加
RegexOptions.Singleline选项,让.匹配所有字符(包括换行):
var matches = Regex.Matches(input, @"\/\*(.*?)\*\/", RegexOptions.Singleline);
- 把
.*?换成[\s\S]*?,[\s\S]代表所有空白和非空白字符,也就是所有字符:
\/\*([\s\S]*?)\*\/
内容的提问来源于stack exchange,提问作者Mikołaj Waśniewski
相关产品推荐
相关产品推荐

