【问题标题】:Get particular field or characters from string line in C#从 C# 中的字符串行获取特定字段或字符
【发布时间】:2018-09-03 06:53:50
【问题描述】:

我有一个文件并逐行读取文件并从字符串行中提取特定对象。

例如字符串行有两种格式。

VA001748714600006640126132202STRONG 4P 4X44G000099

VA 00174 871460000664 012 6132202 STRONG 4P 4X44G 000099

现在我需要提取字符串并将其存储到我的表中,并且在下面的字段(Desire Results)中生成下面和上面两行数据的字段。

 Code  Location    SerialNo     Quantity  ItemNo      Description      Price
  VA    00174     871460000664     12     6132202    STRONG 4P 4X44G0  000099

我尝试过的。我创建了一种返回object[] 从字符串中提取的方法

public static object[] ProcessLine(string line)
{
        var obj = new object[7];
        var str = line.Replace("\0", "").Replace(" ", "");
        string code = str.Substring(0, 2)?.Trim();
        string location = str.Substring(2, 5)?.Trim();
        string serialNo = str.Substring(7, 12)?.Trim();
        string quantity = str.Substring(19, 3)?.Trim();
        int qty = 0;
        if (!string.IsNullOrEmpty(quantity))
        {
            qty = Convert.ToInt32(quantity);
        }
        string itemNo = str.Substring(22, 7)?.Trim();
        Regex MyRegex = new Regex("[^a-z ]", RegexOptions.IgnoreCase);
        string description = MyRegex.Replace(line.Substring(2), @"")?.Trim();
        string price = str.Substring(str.Length - 6)?.Trim();
        obj.SetValue(code, 0);
        obj.SetValue(location, 1);
        obj.SetValue(serialNo, 2);
        obj.SetValue(qty, 3);
        obj.SetValue(itemNo, 4);
        obj.SetValue(description, 5);
        obj.SetValue(price, 6);
        return obj;
}

我已经找到子字符串并存储到对象中,我也找不到描述,因为这个字段不是固定字母。

(Code,Location,SerialNo,Quantity,ItemNo and Price) 是固定的字符数,(Description) 字段是任何字符或更改。

如何使用regex 查找此字段值和描述我试图找到描述,但它提取时没有数字。

【问题讨论】:

  • 为什么Description STRONG 4P 4X44G0 并且在单词中包含spce 你的Substring 有什么逻辑吗?
  • 你可以使用像^(\w{2})\s*(\w{5})\s*(\w{13})\s*(\d{3})\s*(\d{7})\s*(.*?)\s*(\d{6})$这样的正则表达式。
  • @DragandDrop 错字我刚刚编辑,是的数量是 3 个字符
  • 好吧,如果您将 13 替换为 12,那么 Wiktor 正则表达式将起作用。您只需访问该组
  • @DragandDrop 是的,我在编辑后看到了。我更新了答案以反映这一变化。

标签: c# regex pattern-matching


【解决方案1】:

如果您真的想使用正则表达式,请参阅Wiktor's answer

但是,您不需要正则表达式来解决这个问题。

由于除描述之外的所有字段都具有已知长度,因此您可以计算描述字段的长度。根据您的规范,描述从位置 29 开始,然后是价格字段的 6 个位置。因此,这应该给你描述:

string description = str.Substring(29, str.Length-29-6);

【讨论】:

    【解决方案2】:

    你可以声明一个正则表达式

    private static readonly Regex rx = new Regex(@"^(\w{2})\s*(\w{5})\s*(\w{12})\s*(\d{3})\s*(\d{7})\s*(.*?)\s*(\d{6})$", RegexOptions.Compiled);
    

    请参阅regex demo

    重点是使用匹配整个字符串的正则表达式(^ 匹配字符串的开头,$ 匹配字符串的结尾),使用\w(任何字母/数字/_ chars) or \d (any digit char), {m} 量词匹配一定数量的 chars 匹配 \w\d, 匹配 Description 字段和 .*?, 一个惰性点模式尽可能少地匹配除换行符以外的任何 0+ 字符,并允许在 \s* 的字段之间使用任何 0+ 空格字符。

    那么,你就可以使用它了

    public static object[] ProcessLine(string line)
    {
        object[] obj = null;
        var m = rx.Match(line);
        if (m.Success)
        {
            obj = new object[] {
                m.Groups[1].Value,
                m.Groups[2].Value,
                m.Groups[3].Value,
                int.Parse(m.Groups[4].Value).ToString(), // remove leading zeros
                m.Groups[5].Value,
                m.Groups[6].Value,
                m.Groups[7].Value
            };
        }
        return obj;
    }
    

    查看C# demo,OP 中两个字符串的演示输出:

    VA, 00174, 871460000664, 12, 6132202, KING PEPERM E STRONG 4P 4X44G, 000099
    VA, 00174, 871460000664, 12, 6132202, KING PEPERM E STRONG 4P 4X44G, 000099
    

    【讨论】:

    • 你能帮我解决上面的正则表达式吗?但更改后需要正则表达式来支持分手后。 VA0002050001125453570246121648SPRITE REFRESH 33CL 00006020190618142214VA0002050001125453570246121648SPRITE REFRESH 33CL 000060 表示如何在正则表达式中选择最后 14 个字符 ^(\w{2})\s*(\w{5})\s*(\w{13})\s*(\d{3})\s*(\d{7})\s*(.*?)\s*(\d{6})\s*(\d{14})$ 这里最后 14 位可选
    • @LaljiDhameliya 很好,您没有发布单独的问题,这将是重复的。见regex101.com/r/kqVdq9/1
    猜你喜欢
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    相关资源
    最近更新 更多