2017-05-12 123 views
2

我想要在下面以「need」字開頭的字符串中捕獲粗體值,而其他字符串中以「skip」和「ignored」開頭的單詞必須忽略。我試過模式查找在特定子字符串中匹配的多個組

need.+?(:"(?'index'\w+)"[,}])

,但發現只有第一(ephasised)值。我如何才能使用RegEx獲得需要的結果?

「跳過」:{ 「A」: 「ABCD123」, 「B」: 「ABCD1234」, 「C」: 「ABCD1235」}

「需要」:{ 「A」:」 ZABCD123 「 」B「:」 ZABCD1234 「 」C「:」 ZABCD1235 「}

」忽略「:{」 A 「:」 SABCD123" , 「B」: 「SABCD1234」,」 C「:」SABCD1235「}

+0

Loo ks像JSON。你應該解析它並從那裏使用它。 –

+0

我只需要使用RegEx – managerger

+0

爲什麼?這很愚蠢。使用正確的工具來完成這項工作。 –

回答

1

我們將發現need並將我們找到的組分爲Named Match Group =>Captures。將有兩個組,一個名爲Index,其中包含A | B | C,然後一個名爲Data

比賽將舉行我們的數據,這將是這樣的:

enter image description here

從那裏,我們將它們合併成一個字典:

enter image description here

下面是代碼做那神奇:

string data = 
@"""skip"" : {""A"":""ABCD123"",""B"":""ABCD1234"",""C"":""ABCD1235""} 
""need"" : {""A"":""ZABCD123"",""B"":""ZABCD1234"",""C"":""ZABCD1235""} 
""ignore"" : {""A"":""SABCD123"",""B"":""SABCD1234"",""C"":""SABCD1235""}"; 

string pattern = @" 
\x22need\x22\s *:\s *{ # Find need 
(      # Beginning of Captures 
    \x22      # Quote is \x22 
    (?<Index>[^\x22] +)  # A into index. 
    \x22\:\x22    # ':' 
    (?<Data>[^\x22] +)  # 'Z...' Data 
    \x22,?     # ',(maybe) 
)+      # End of 1 to many Captures"; 


var mt = Regex.Match(data, 
        pattern, 
        RegexOptions.IgnorePatternWhitespace | RegexOptions.ExplicitCapture); 

// Get the data capture into a List<string>. 
var captureData = mt.Groups["Data"].Captures.OfType<Capture>() 
              .Select(c => c.Value).ToList(); 

// Join the index capture data and project it into a dictionary. 
var asDictionary = mt.Groups["Index"] 
        .Captures.OfType<Capture>() 
        .Select((cp, iIndex) => new KeyValuePair<string,string> 
               (cp.Value, captureData[iIndex])) 
        .ToDictionary(kvp => kvp.Key, kvp => kvp.Value); 
+0

這絕對是我正在尋找的。標記爲已接受,謝謝! – managerger

1

如果字段數量是固定的 - 您可以將其編碼爲:

^"need"\s*:\s*{"A":"(\w+)","B":"(\w+)","C":"(\w+)"} 

Demo

如果標籤將是值 - 這樣的:

{ 「A」: 「ABCD123」, 「B」: 「ABCD1234」, 「C」: 「ABCD1235」}「skip」 {「A」:「ZABCD123」,「B」:「ZABCD1234」,「C」:「ZABCD1235」}:「need」 {「A」:「SABCD123」,「B 「:」SABCD1234「,」C「:」SABCD1235「}:」忽略「

然後,你可以使用無限陽性

"\w+?":"(\w+?)"(?=.*"need") 

Demo

無限正面看後面在PCREare prohibited提前的樣子。 (禁止使用*+操作符來查看後面的語法)。所以,在沒有你的情況

+0

字段數量不固定。因此,下一個答案是最它允許找到任意數量的值。謝謝) – managerger

相關問題