簡體   English   中英

如何排除正則表達式中分隔符之間的多行?

[英]How to exclude multiple lines between separators in regex?

我正在處理一些日志,其中每個信息字段都有多個分隔符,例如:

********** Field #1 **********
Content inside Field #1
More content

********** Field #2 **********
Content inside Field #2
More content

...

********** The last field will always remain unchanged **********
Unchanged content from last field

我必須定期刪除各個字段中的所有內容,並手動提供將占用該空間的新數據。 問題是日志太長到 select 並手動刪除所有這些內容,所以我在Notepad++查找/替換中編寫了一個 RegEx 來檢測分隔符*的結尾和后續行\r\n直到它顛簸進入另一個*

以下是我的表達:

(?<=\*)([^\*]+\r\n)(?=\*)

怎么運行的:

  • 第一組:從一組星號/星號分隔符中捕獲最后一個*
  • 第二組:捕獲分隔符內不是星號或文本的所有內容,並以換行符結尾(至少我相信這是正確的解釋);
  • 第三組:捕獲左分隔符*的開頭。

正如您可能已經在日志示例中讀到的那樣,無論如何,最后一個字段必須保持不變。 所以我正在努力匹配最后一個字段之后的確切位置。 我嘗試將最后一個字段的內容中的一些唯一引用放在第 2 組的否定\*匹配列表中,但沒有成功。

目前,我編寫的解決方案適用於所有字段,但我想在最后一個字段必須保持不變並且能夠在不更改最后一個字段的情況下Replace All的條件下進行。 我們有什么辦法可以使用現有的解決方案並加以改進嗎? 如果沒有,對於這種情況是否有另一種不同的解決方案?

非常感謝您的幫助。

更新:任何內容字段都不能包含*星號/星號,而且*星號/星號的數量可能因字段而異。 它們僅用於分隔日志文件中的不同信息。

我的意圖是使用此規則並在查找/替換中將匹配的內容替換為\n\n 它會產生這樣的東西:

********** Field #1 **********

********** Field #2 **********

...

********** The last field will always remain unchanged **********
Unchanged content from last field

您可以匹配以星號開頭和結尾的行,然后忘記到目前為止匹配的內容。

匹配所有不以星號開頭的要刪除的行

^\*.*\R\K.*(?:\R(?!\*).*)*\R(?=\*)

模式匹配:

  • ^字符串開始
  • \*.*\R匹配*后跟該行的 rest 和一個換行符
  • \K忘記到目前為止匹配的內容
  • .*匹配整行
  • (?:\R(?.\*).*)*可選地重復匹配所有不以星號開頭的行
  • \R匹配換行符
  • (?=\*)正向前瞻,向右斷言*

正則表達式演示

然后替換為您的內容,然后換行。

我會用這個正則表達式試試:

(^\*+.*\*+$\n)(?:.*\n)+?(?=^\*+.*\*+$\n)

這將找到內容為** field 1 **的第一行到第一組(包括一個\n - 請在必要時添加一個\r ,以便每個\n變成一個\r\n ),然后匹配所有內容包括換行符(這里再次僅使用\n )直到下一個字段 header 緊隨其后(但下一個字段 header 不是匹配項的一部分)。

所以你可以用組 1 替換這個表達式,如果你重復這個,應該只留下字段標題。 (提示:在 NotePad++ 中,您可以將\1設置為替換來實現此目的。)

由於最后一個字段后面沒有另一個字段 header,因此它也永遠不會匹配。

請注意,正則表達式預計每個字段 header 行的開頭和結尾至少有兩個*

NotePad++ 的另一個提示:請取消選中“. matches newline”選項以獲得您想要的結果。

試試https://regex101.com/r/5kc4m6/1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM