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