C# 格式化非结构化字符串

C# 格式化非结构化字符串,c#,regex,parsing,C#,Regex,Parsing,我尝试了几种按位置、按空格、按正则表达式的方法,但无法找到如何最好地将以下行解析为表。例如,假设我要分析的两行是: Bonds Bid Offer (mm) (mm) Chng STACR 2015-HQA1 M1 125 120 5 x 1.5 0 STACR 2015-HQA12 2M2 265 5 x -2 我希望[BondName][Bid][Offer]的解析如下: [STACR 2015-HQA1 M1

我尝试了几种按位置、按空格、按正则表达式的方法,但无法找到如何最好地将以下行解析为表。例如,假设我要分析的两行是:

Bonds               Bid   Offer  (mm)   (mm) Chng
STACR 2015-HQA1 M1  125    120    5   x 1.5   0
STACR 2015-HQA12 2M2  265  5   x       -2
我希望[BondName][Bid][Offer]的解析如下:

[STACR 2015-HQA1 M1] [125] [120]

[STACR 2015-HQA12 2M2] [265] [null]
注意null,它是一个实际值,并且空格应该保留在bond名称中。仅供参考,债券名称中的空格数为2,如上述示例所示

编辑:因为你们中的许多人都要求在这里输入代码。点之间的空间可以从1到5不等,因此我无法回答空间的问题,因为当时很简单

字符串bondName=quoteLine.Substring0,19; 字符串bid=quoteLine.Substring19,5.Trim; 字符串报价=quoteLine.Substring24,6.修剪; 我能看到这一切的唯一办法是:

第一个数据点是STACR类型 第二个数据点是年份和系列 e、 g.2015-HQA1 第三个数据点是M1期 第四个数据点是投标 e、 g.125**投标始终可用** 提供第5个数据点,例如120,但可以为空 或者空白,这会带来复杂性
根据当前的一组需求,我假设如下 1.字符串以三部分键名称开头 2.接着是投标 3.然后是可选的报价 4.在那之后,我们会有一些像。。。x。。。我们将使用x作为参考

如果它们是有效的,您可以使用以下代码

var str = "STACR 2015-HQA1 M1  125    120    5   x 1.5   0"; //your data
var parts = str.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList();

//we'll use this pattern : <3 part bond name> <bid> <offer/null> <something x ....>
var xIsAt = parts.IndexOf("x"); //we'll use x as reference
if (xIsAt > 2) //first three are BondName
    parts.RemoveRange(xIsAt - 1, parts.Count - xIsAt + 1); //remove "5 x 1.5 ..."
var bond = string.Join(" ", parts.Take(3)); //first 3 parts are bond
var bid = parts.Count > 3 ? parts.ElementAt(3) : null; //4th is bid
var offer = parts.Count > 4 ? parts.ElementAt(4) : null; //5th is offer
[编辑] 我没有解释空白的“要约”,所以这种方法将在一个空白的“提议”中失败。看起来有人已经有了一个有效的答案,但我将把linq示例留给任何觉得有用的人。 [结束编辑]

基于Linq的选项

按空格分隔字符串,并删除空空格。然后颠倒顺序,这样你就可以从后面开始前进。数据在字符串末尾显示得更规范

对于该行的每个连续部分,您都会跳过前面的选项,只获取您需要的内容。对于最后一部分,即长字符串,您可以跳过不需要的部分,然后将顺序反转回正常状态,并用空格将段连接在一起

        string test = "STACR 2015-HQA1 M1  125    120    5   x 1.5   0";

        var split_string_remove_empty = test.Split(new char[]{ ' ' }, StringSplitOptions.RemoveEmptyEntries).Reverse();

        var change = split_string_remove_empty.Take(1)
                                              .SingleOrDefault();
        var mm2 = split_string_remove_empty.Skip(1)
                                           .Take(1)
                                           .SingleOrDefault();
        var mm3 = split_string_remove_empty.Skip(3)
                                           .Take(1)
                                           .SingleOrDefault();
        var offer = split_string_remove_empty.Skip(4)
                                             .Take(1)
                                             .SingleOrDefault();
        var bid = split_string_remove_empty.Skip(5)
                                           .Take(1)
                                           .SingleOrDefault();
        var bonds = string.Join(" ", split_string_remove_empty.Skip(6)
                                                              .Reverse());
输出:

在选项卡上拆分怎么样?列之间总是至少有2个空格吗?我相信您可以迭代使用字符串。在空格上拆分,但如果您显示一些代码,如果你有STATR 2015-HQA12 2M2 265×5×2,你如何决定265是出价还是要约?@ NyCDAN我也试过了,但是让我们以第二条记录为例,在265之后,我不希望解析器考虑5作为要约。