繁体   English   中英

正则表达式 - 如何匹配块注释

[英]Regex - how to match a block comment

当谈到正则表达式时,我总是迷路。 我在 C# 中创建了一个编辑器来处理纸莎草脚本,我遇到的问题是用户要求我设置样式块注释“;/ /;” 已经为使用“;”的单行工作

这是我到目前为止的代码
var inputData = @"comment test 并且这一行不应该显示
;/
评论第 1 行
评论第 2 行
评论第 3 行
/;
不应该显示";

        PapyrusCommentRegex1 = new Regex(@"(;/\*.*?\/;)|(.*\/;)", RegexOptions.Singleline);
        
        foreach (Match match in PapyrusCommentRegex1.Matches(inputData))
        {
            if (match.Success)
            {
                textBox1.AppendText(match.Value + Environment.NewLine);
            }
        }

我得到的结果是

评论测试,这条线不应该显示
;/
评论第 1 行
评论第 2 行
评论第 3 行
/;

“;/”之前的所有行都显示。 我的问题是我在正则表达式中做错了什么? 在此先感谢大家

编辑:为了更清楚,我需要 C# 中的正则表达式模式来查找所有以“;/”开头并以“/;”结尾的块注释并且需要包含“;/ /;”

既然您说您需要在 .NET 库中使用正则表达式来执行此操作,我猜您可能想要一个使用平衡组来匹配块注释的正则表达式

(?x)  # ignore spaces and comments
(
;/                 # open block comment
(?:
  (?<open> ;/ )*   # open++
  .+
  (?<-open> /; )*  # open--
)+
/;                 # close
(?(open)(?!))      # fail if unblanaced: open > 0
)

这应该给你你想要的。 正则表达式演示


有些人提到了字符串中的块注释问题(*SKIP)((*FAIL) \K ?可用。我会尝试匹配并捕获您需要的内容,但只匹配您不需要的内容:

这与您的块注释和“...”字符串匹配。 诀窍是只查看blockcomment捕获组:

(?x)  # ignore spaces and comments
(
;/                 # open block comment
(?:
  (?<open> ;/ )*   # open++
  .+
  (?<-open> /; )*  # open--
)+
/;                 # close
(?(open)(?!))      # fail if unblanaced: open > 0
)
|
(?:(?<openq>")
  [^"]*?
  (?<-openq>")*
)+(?(openq)(?!))

演示代码

我希望你可以在你的代码中应用它。

试试这个

(;/.*?/;)|(;.*?(?=$|[\r\n]))

请注意,我仍在使用SingleLine模式。

|之前的部分匹配多行注释, |之后的部分匹配单行注释(在遇到文本$或新行\r或 \n` 时结束的注释。请注意,正则表达式不会捕获单行末尾的行尾-line 注释,所以

;xyz\n

\n不会被捕获。 要捕获它:

(;/.*?/;)|(;.*?(?:$|\r\n?|\n))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM