850 EDI文件的正则表达式

本文关键字:正则表达式 文件 EDI | 更新日期: 2023-09-27 18:00:40

我有一个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;

850 EDI文件的正则表达式

问题是[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;