2012-06-15 73 views
7

我有一系列遵循特定格式的分組值,並希望使用單個表達式將它們捕獲到組中。 例如,我有-group1 -group2 -group3,並試圖使用類似(-[\s\S]{1,}?)這基本上允許我捕獲整個字符串到一個單一的組,但我想能夠反向引用每個值分開。我認爲?會強制它非貪婪,因此,將模式匹配分成三個獨立的組(例如)。 現在我只是重複參考(-[\s\S]*?),但它似乎應該有一個更優雅的表達。
謝謝!正則表達式來選擇重複組

+0

這有些含糊。您能否顯示一些示例文本和預期的分組結果,包括您想要反向引用的內容? –

+0

順便說一句,'[\ s \ S]'說:「匹配任何空格或非空格字符」。考慮一下。 ;) – qJake

回答

14

你是幸運的,因爲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

+1。我相信這也是他所要求的。另外,PHP提供了這個''preg_match_all(...)''功能;使用PREG_SET_ORDER標誌返回一個多維數組,第一個數組包含第一個數組,第二個數組包含第二個數組等等(其他標誌允許不同的表示)。我的猜測是,如果.NET和PHP已經實現它,其他語言也有。 –

+0

@ acheong87好評,我將它添加到不冒犯其他語言的答案:)我從正則表達式專家Jan Goyvaerts那裏得知,.NET在這方面是獨一無二的,但我在其他平臺上的活動不足以支持向上。 – buckley

+2

@ acheong87,那不是一回事。 'preg_match_all()'重複應用正則表達式並返回收集的結果,類似於.NET的'Matches()'方法。 OP想要執行* 1 *匹配將消耗整個字符串,然後打破個別捕獲。 .NET爲此提供了'CaptureCollection',但PHP沒有任何等價物。 –

0

試試這個:

(-.+?)(\s|$) 

你的第一個捕獲組將有你想要的東西(-group1-group2等)。

如果您想要更多地控制-之後允許的內容,請將.+?更改爲例如[a-zA-Z0-9]+?以僅匹配字母數字字符。

2

在.NET正則表達式(幾乎只.NET),你可以使用:

(?:(-\S+)\s*)+ 

第1組包含所有匹配的字符串的列表。

或者,也許只是使用Matches你的情況充分:

var re = new Regex(@"-\S+"); 
var matches = re.Matches(str);