我有一系列遵循特定格式的分組值,並希望使用單個表達式將它們捕獲到組中。 例如,我有-group1 -group2 -group3
,並試圖使用類似(-[\s\S]{1,}?)
這基本上允許我捕獲整個字符串到一個單一的組,但我想能夠反向引用每個值分開。我認爲?
會強制它非貪婪,因此,將模式匹配分成三個獨立的組(例如)。 現在我只是重複參考(-[\s\S]*?)
,但它似乎應該有一個更優雅的表達。
謝謝!正則表達式來選擇重複組
回答
你是幸運的,因爲C#是少數語言之一(如果不是唯一的一個)支持的子表達式捕獲
https://msdn.microsoft.com/en-us/library/system.text.regularexpressions.capture(v=vs.110)
的.NET API可以在如下
Matches
Groups (most regex engines stop here)
Captures (unique for .NET)
加以研究
從你的問題中不清楚你想要完全匹配什麼,但這應該讓你開始。再次詢問你是否卡住了。
string input = "-group1 -group2 ";
string pattern = @"(-\S*\W){2}";
foreach (Match match in Regex.Matches(input, pattern))
{
Console.WriteLine("Match: {0}", match.Value);
for (int groupCtr = 0; groupCtr < match.Groups.Count; groupCtr++)
{
Group group = match.Groups[groupCtr];
Console.WriteLine(" Group {0}: {1}", groupCtr, group.Value);
for (int captureCtr = 0; captureCtr < group.Captures.Count; captureCtr++)
Console.WriteLine(" Capture {0}: {1}", captureCtr,
group.Captures[captureCtr].Value);
}
}
此。OUPUTS
Match: -group1 -group2
Group 0: -group1 -group2
Capture 0: -group1 -group2
Group 1: -group2
Capture 0: -group1
Capture 1: -group2
正如你可以看到(第1組,捕捉0)和(第1組,採集1)提供一組的各個捕獲(而不是最後一個,因爲在大多數語言)
這個地址我想你形容爲「能夠反向引用的每個單獨的值的」
(您使用術語反向引用,但我不認爲你的目標爲AR放置模式是否正確?)
+1。我相信這也是他所要求的。另外,PHP提供了這個''preg_match_all(...)''功能;使用PREG_SET_ORDER標誌返回一個多維數組,第一個數組包含第一個數組,第二個數組包含第二個數組等等(其他標誌允許不同的表示)。我的猜測是,如果.NET和PHP已經實現它,其他語言也有。 –
@ acheong87好評,我將它添加到不冒犯其他語言的答案:)我從正則表達式專家Jan Goyvaerts那裏得知,.NET在這方面是獨一無二的,但我在其他平臺上的活動不足以支持向上。 – buckley
@ acheong87,那不是一回事。 'preg_match_all()'重複應用正則表達式並返回收集的結果,類似於.NET的'Matches()'方法。 OP想要執行* 1 *匹配將消耗整個字符串,然後打破個別捕獲。 .NET爲此提供了'CaptureCollection',但PHP沒有任何等價物。 –
試試這個:
(-.+?)(\s|$)
你的第一個捕獲組將有你想要的東西(-group1
,-group2
等)。
如果您想要更多地控制-
之後允許的內容,請將.+?
更改爲例如[a-zA-Z0-9]+?
以僅匹配字母數字字符。
在.NET正則表達式(幾乎只.NET),你可以使用:
(?:(-\S+)\s*)+
第1組包含所有匹配的字符串的列表。
或者,也許只是使用Matches
你的情況充分:
var re = new Regex(@"-\S+");
var matches = re.Matches(str);
- 1. 正則表達式可選重複組
- 2. 正則表達式來選擇#OnlinePopup和_
- 3. 正則表達式來選擇子
- 4. 正則表達式來選擇ID
- 5. 正則表達式DOW可選重複
- 6. 正則表達式捕捉重複組
- 7. 重複正則表達式組
- 8. 正則表達式重複組
- 9. 組重複正則表達式?
- 10. 正則表達式 - 重複組
- 11. PHP正則表達式 - 重複一組
- 12. 正則表達式 - 重複捕獲組
- 13. 重複的正則表達式組
- 14. 重複使用正則表達式組
- 15. 正則表達式:搜索重複組
- 16. 正則表達式重複組
- 17. 正則表達式選擇3組
- 18. 正則表達式分組選擇
- 19. 正則表達式重複
- 20. 正則表達式重複
- 21. 正則表達式選擇
- 22. 正則表達式中的一個表達式來選擇子
- 23. 選擇正則表達式的正則表達式中間值
- 24. 正則表達式來獲取重複組
- 25. 的Javascript正則表達式重複可選組
- 26. Python正則表達式重複組內重複
- 27. 正則表達式(VBA) - 重複模式
- 28. 正則表達式 - 重複模式
- 29. 正則表達式的重複模式
- 30. 正則表達式重複組或顯式模式
這有些含糊。您能否顯示一些示例文本和預期的分組結果,包括您想要反向引用的內容? –
順便說一句,'[\ s \ S]'說:「匹配任何空格或非空格字符」。考慮一下。 ;) – qJake