You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则表达式:如何匹配子分组以精准提取代码注释?

解决正则匹配单个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); // 这里就是你要的子分组内容
}

运行后会输出两个独立的注释,而不是一整段。

额外注意:处理带换行的注释

如果你的注释里包含换行符,默认的.不会匹配换行,这时候可以用两种方法解决:

  1. 添加RegexOptions.Singleline选项,让.匹配所有字符(包括换行):
var matches = Regex.Matches(input, @"\/\*(.*?)\*\/", RegexOptions.Singleline);
  1. 把.*?换成[\s\S]*?,[\s\S]代表所有空白和非空白字符,也就是所有字符:
\/\*([\s\S]*?)\*\/

内容的提问来源于stack exchange,提问作者Mikołaj Waśniewski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:36:14