![](/img/trans.png)
[英]Yet another “A query body must end with a select clause or a group clause”
[英]Yet Another MultiLine Group Regex Query
因此,我試圖編寫一個正則表達式來過濾特定摘要的文本文件(尋找速度而不是蠻力)。
我想從每場比賽中得到三件事:
這是正則表達式(可以在此處找到失敗的測試工具-https : //gist.github.com/shiftkey/5236161 ):
(?s)code start (?<key>[A-Za-z-]*) (?<language>[A-Za-z]*).*[\\n](?<value>.*?)[\\n].*end code (?<key>[A-Za-z-]*)
使用以下選項: RegexOptions.Compiled | RegexOptions.ExplicitCapture | RegexOptions.Multiline
RegexOptions.Compiled | RegexOptions.ExplicitCapture | RegexOptions.Multiline
RegexOptions.Compiled | RegexOptions.ExplicitCapture | RegexOptions.Multiline
。
所以這樣的文件:
// code start foo csharp
var x = 1;
// end code foo
給我期望值:
var x = 1;
但是,當我引入第二行的代碼片段時,我只會得到最后一行:
// code start foo csharp
var x = 1;
var y = 2;
// end code foo
var y = 2;
代替
var x = 1;\\r\\nvar y = 2;
(或類似) 讓小組涵蓋多行內容時,我錯過了什么?
我已經看過在SO上提出的類似情況,但是這些情況不適用於我的用法。
可以通過更改兩個.*
的貪婪來解決此問題:
(?s)code start (?<key>[A-Za-z-]*) (?<language>[A-Za-z]*).*?[\n](?<value>.*)[\n].*?end code (?<key>[A-Za-z-]*)
閱讀語言后的.*
一定不要太貪婪,因為我們需要在第一行后加上內容作為摘要值。 但是,用於解析value
的.*
可能會更加貪婪,因為它不應該在遇到第一個\\n
停止,因此是上面的模式。
如果您願意的話,還可以使用一些環顧四周的東西進行捕捉...
(?<=code\sstart\s)(?<key>\b\w+\b)\s(?<language>\b\w+\b).*\r\n(?<content>(?s).*)(?=\r\n.*end\scode\s\1\s-->)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.