[英]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.