850 EDI 文件的正则表达式

Regular Expression for 850 EDI file

我有一个网络服务,可以解析所有类型的 EDI 文件,并在需要时将它们转换为 XML。为了知道我正在处理什么类型的文件和客户,我需要做一个正则表达式,以便从 850 EDI 文件的 N1 段中获取客户发货 ID。该客户未使用我们的标准 X12 实现。我需要模式变量括号中的所有三个值。我似乎无法让我的正则表达式工作以使客户发货到 id。有人可以告诉我我的正则表达式哪里出了问题吗?我已经包含了文件中的一些样本数据。在此示例中,客户收货地址为“333333”。名称为 "Test123 Information Goes Here",代码限定符为“91”。

string input = "ISA`00`          `00`          `01`111111111      `01`222222222      `150629`1243`U`00401`000011282`0`T`!^GS`PO`111111111`222222222`20150629`1243`11282`X`004010^ST`850`0001^BEG`00`NE`4503214505``20150421`^N1`BT`Test123 Information Goes Here`91`333333^";
char segmentDelimiter = input[105];
char elementDelimiter = input[103];
string pattern = String.Format(@"N1{0}BT{0}([A-Za-z0-9]+){0}([A-Za-z0-9]+){0}([A-Za-z0-9]+)\{1}$", elementDelimiter, segmentDelimiter);
Match match = Regex.Match(input, pattern, RegexOptions.IgnoreCase);
string customerShipToID = match.Groups[3].Value;

问题是 [A-Za-z0-9]+ 与 "Test123 Information Goes Here" 中的空格不匹配。由于段被分隔,您应该能够将正则表达式简化为以下内容。此外,您不希望锚点位于末尾,因为我猜 N1 段通常不会是您文件中的最后一个。此外,我不确定您是否真的需要 RegexOptions.IgnoreCase 因为段名称和限定符应该是大写的。最后,您应该在分隔符上使用 Regex.Escape() 以确保在需要时对它们进行转义,而不是假设需要分隔段分隔符。

string input = "ISA`00`          `00`          `01`111111111      `01`222222222      `150629`1243`U`00401`000011282`0`T`!^GS`PO`111111111`222222222`20150629`1243`11282`X`004010^ST`850`0001^BEG`00`NE`4503214505``20150421`^N1`BT`Test123 Information Goes Here`91`333333^";
char segmentDelimiter = input[105];
char elementDelimiter = input[103];
string pattern = string.Format(
    @"N1{0}BT{0}(.*?){0}(.*?){0}(.*?){1}", 
    Regex.Escape(elementDelimiter.ToString()), 
    Regex.Escape(segmentDelimiter.ToString()));
Match match = Regex.Match(input, pattern);
string customerShipToID = match.Groups[3].Value;