850 EDI文件的正则表达式

时间:2015-06-30 15:39:30

标签: c# regex edi

我有一个Web服务,可以解析所有类型的EDI文件,并在需要时将它们转换为XML。为了知道我正在处理什么类型的文件和客户,我需要做一个正则表达式,以便让客户从850 EDI文件中的N1段发送到id。该客户未使用我们的标准X12实施。我需要在模式变量中括号中的所有三个值。我似乎无法使我的正则表达式工作,以使客户发送到id。有人可以告诉我我的正则表达式出错了吗?我已经从文件中包含了一些示例数据。在此示例中,客户发送到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;

1 个答案:

答案 0 :(得分:0)

问题是[A-Za-z0-9]+不匹配" Test123信息在这里"中的空格。您应该能够将正则表达式简化为以下内容,因为这些段是分隔的。此外,您不希望锚定在最后,因为我猜测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;