从C#中的字符串行中获取特定字段或字符

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从C#中的字符串行中获取特定字段或字符相关的知识,希望对你有一定的参考价值。

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

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

VA001748714600006640126132202STRONG 4P 4X44G000099

VA 00174 871460000664 012 6132202 STRONG 4P 4X44G 000099

现在我需要提取字符串并存储到我的表格和字段中,如下面和上面两个行数据生成在下面的字段(欲望结果)。

 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("", "").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)是固定的no.of字符,(Description)字段是任何字符或更改。

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

答案

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

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(任何字母/数字/ _字符)或d(任何数字字符),{m}量化器匹配与wd匹配的一定数量的字符,匹配Description字段与.*?,一个尽可能少地匹配除换行符之外的任何0+字符的懒点模式,并允许字段之间的任何0+空格字符与s*

然后,你可以使用它

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;
}

请参阅OP中两个字符串的C# demo演示输出:

VA, 00174, 871460000664, 12, 6132202, KING PEPERM E STRONG 4P 4X44G, 000099
VA, 00174, 871460000664, 12, 6132202, KING PEPERM E STRONG 4P 4X44G, 000099
另一答案

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

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

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

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

以上是关于从C#中的字符串行中获取特定字段或字符的主要内容,如果未能解决你的问题,请参考以下文章

Java:如何更改文本区域中特定行或字符串行的颜色?

在C#中的某个特定字符后获取值

如何从 webview 中的 json responseString 获取特定方法

从字符串中获取特定数据? C#

从 2 个不同片段的 sqlite 中的 2 个表中获取信息

在文本字段中的特定字符串之前获取文本字段中的字符串