簡體   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