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

C# 从C中的字符串行获取特定字段或字符#,c#,regex,pattern-matching,C#,Regex,Pattern Matching,我有一个文件,逐行读取文件,并从字符串行中提取特定对象 例如,字符串行有两种格式 VA001748714600006640126132202STRONG 4P 4X44G000099 VA 00174 871460000664 012 6132202 STRONG 4P 4X44G 000099 现在我需要提取字符串并将其存储到我的表和字段中,如下面和上面的两行数据在下面的字段中生成(期望结果) 我已经试过了。我创建了一个返回object[]extract from string的方法 pu

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

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

VA001748714600006640126132202STRONG 4P 4X44G000099

VA 00174 871460000664 012 6132202 STRONG 4P 4X44G 000099
现在我需要提取字符串并将其存储到我的表和字段中,如下面和上面的两行数据在下面的字段中生成(期望结果)

我已经试过了。我创建了一个返回
object[]
extract from string的方法

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;
}
我已经找到子字符串并存储到对象中,也找不到描述,因为该字段不是固定字母

(代码、位置、序列号、数量、项目号和价格)
是固定的字符数,
(说明)
字段是任何字符或更改


如何使用
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);

关键是要使用一个匹配整个字符串的正则表达式(
^
匹配字符串的开头,
$
匹配字符串的结尾),使用
\w
(任意字母/数字/
\u
字符)或
\d
(任意数字字符),
{m}
量词,用于匹配与
\w
\d
匹配的一定数量的字符,将
描述
字段与
*?
匹配,这是一种惰性点模式,与新行以外的任何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;
}
请参阅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

如果确实要使用正则表达式,请参阅

但是,这个问题不需要正则表达式

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

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

为什么
Description
STRONG 4P 4X44G0
并且在单词中包含spce在
子字符串中是否有任何逻辑?
?您可以像使用正则表达式一样使用。@DragandDrop由于键入错误,我刚刚编辑,是的数量是3个字符,因此如果您将13替换为12,Wiktor正则表达式可以工作。您只需访问group@DragandDrop是的,我在编辑后看到了。我更新了答案以反映这一变化。你能帮我处理上面的正则表达式吗?它工作正常。但在发生变化后,分手后需要regex提供支持
VA000205000125453570246121648Sprite REFRESH 33CL 0000600190618142214和
VA00020500012545357024621648Sprite REFRESH 33CL 000060意味着如何在正则表达式中选择最后14个字符
(\w{2})\s*(\w{5})\s*(\w{13})\s*(\d{3})\s*(\d{7})\s*(*s*)(*d{6}\d})$
这里是最后14位数字optional@LaljiDhameliya很好,你没有发布一个单独的问题,这将是一个重复。看见
string description = str.Substring(29, str.Length-29-6);