2014-10-31 100 views
1

我有一個正則表達式模式匹配,我有一些困難設計圍繞它的Linq產生所需的輸出。Linq與正則表達式

的數據被固定長度:1231234512341234567

長度在這種情況下是:3, 5, 4, 7

中使用的正則表達式模式是:(.{3})(.{5})(.{4})(.{7})

這所有工作完全正常和圖案的匹配的結果是然而,如預期的那樣,預期產出證明有些困難。實際上,我甚至不確定在SQL語句中會調用什麼 - 除了可能是數據透視查詢。所期望的輸出是利用了來自各組的所有值在給定的位置和將它們連接起來,從而例如:

field1:value1;value2;value3;valueN;field2:value2;value3;valueN; 

使用下面LINQ表達式,我是能夠得到FIELD1-值1,字段2-VALUE2等等......

var matches = Regex.Matches(data, re).Cast<Match>(); 

var xmlResults = from m in matches 
       from e in elements 
       select string.Format("<{0}>{1}</{0}>", e.Name, m.Groups[e.Ordinal].Value); 

,但我似乎無法弄清楚如何從「組」使用元素的序號位置2處獲得在位置1的所有值,那麼所有的值等。

本例中的「元素」是字段名稱和序數位置(從1開始)的集合。因此,它應該是這樣的:

public class Element 
{ 
    public string Name { get; set; } 
    public int Ordinal { get; set; } 
} 

var elements = new List<Element>{ 
    new Element { Name="Field1", Ordinal=1 }, 
    new Element { Name="Field2", Ordinal=2 } 
}; 

我查看了一堆各種LINQ表達式和挖成一些樞軸點方式LINQ表達式,但他們都不讓我接近 - 他們都使用JOIN運算符,我不要以爲是可能的。

有沒有人有任何想法如何使這個Linq?

回答

1

您應該能夠通過改變查詢來做到這一點僅從elements選擇,並通過string.Join帶來的matches,就像這樣:

// Use ToList to avoid iterating matches multiple times 
var matches = Regex.Matches(data, re).Cast<Match>().ToList(); 
// For each element, join all matches, and pull in the value for e.Ordinal 
var xmlResults = elements.Select(e => 
    string.Format(
     "<{0}>{1}</{0}>" 
    , e.Name 
    , string.Join(";", matches.Select(m => m.Groups[e.Ordinal].Value)) 
    ); 

注:這是不是格式化XML的最佳方式。你最好使用.NET的一個庫來製作XML,比如LINQ2XML。

+0

謝謝,我會給它一個。 – 2014-10-31 18:23:04

+0

它很接近 - 第一個SelectMany看起來是在正確的軌道上,但是如何在輸出元素名稱之後使用很多值?另外請注意,我不輸出XML - 這是一種專有格式。 – 2014-10-31 18:27:59

+0

@ChrisGessler如果你不想讓它們在單獨的標籤中,你甚至不需要'SelectMany' - 你可以立即在一個簡單的'Select'中使用'string.Format'和'string.Join'加入它們(參見更新)。 – dasblinkenlight 2014-10-31 18:33:11