林克与雷格斯
本文关键字:雷格斯 林克 | 更新日期: 2023-09-27 18:28:34
我有regex模式的匹配项,在围绕它设计Linq以产生所需输出时遇到了一些困难。
数据为固定长度:1231234512341234567
这种情况下的长度为:3, 5, 4, 7
使用的正则表达式模式为:(.{3})(.{5})(.{4})(.{7})
这一切都很好,模式的匹配结果正如预期的那样,然而,所需的输出被证明有些困难。事实上,我甚至不确定它在SQL术语中会被称为什么——也许除了一个透视查询。所需的输出是从给定位置的每个组中获取所有值,并将它们连接起来,例如:
field1:value1;value2;value3;valueN;field2:value2;value3;valueN;
使用下面的Linq表达式,我可以得到field1-value1、field2-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);
但我似乎不知道如何使用元素的序数从"组"中获得位置1处的所有值,然后是位置2处的所有数值,依此类推
本例中的"元素"是字段名称和序号位置的集合(从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表达式,并深入研究了一些pivot类型的Linq表达,但没有一个能让我接近它们——它们都使用了联接运算符,我认为这是不可能的。
有人知道怎么做这个林克吗?
您应该能够通过将查询更改为仅从elements
中选择,并引入matches
到string.Join
来实现这一点,如下所示:
// 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。