7

我需要解析一个 EDI 文件,其中的分隔符是+:'符号和转义(释放)字符是?. 你首先分成几段

var data = "NAD+UC+ABC2378::92++XYZ Corp.:Tel ?: ?+90 555 555 11 11:Mobile1?: ?+90 555 555 22 22:Mobile2?: ?+90 555 555 41 71+Duzce+Seferihisar / IZMIR++35460+TR"

var segments = data.Split('\'');

然后通过 将每个段拆分为段数据元素+,然后通过 将段数据元素拆分为组件数据元素:

var dataElements = segments[0].Split('+');

由于使用了释放字符,上述示例字符串未正确解析。我有处理这个的特殊代码,但我认为这应该是可行的

Regex.Split(data, separator);

我不熟悉正则表达式,到目前为止还没有找到方法。到目前为止我想出的最好的是

string[] lines = Regex.Split(data, @"[^?]\+");

它省略了符号前的字符+

NA
U
ABC2378::9
+XYZ Corp.:Tel ?: ?+90 555 555 11 11:Mobile1?: ?+90 555 555 22 22:Mobile2?: ?+90 555 555 41 7
Duzc
Seferihisar / IZMI
+3546
TR

正确的结果应该是:

NAD
UC
ABC2378::92

XYZ Corp.:Tel ?: ?+90 555 555 11 11:Mobile1?: ?+90 555 555 22 22:Mobile2?: ?+90 555 555 41 7
Duzce
Seferihisar / IZMIR
35460
TR

所以问题是使用 Regex.Split 是否可行,以及正则表达式分隔符应该是什么样子。

4

2 回答 2

4

+我可以看到,只有在加号前面没有(转义)问号时,您才想拆分加号?。这可以使用以下方法完成:

(?<!\?)\+

+如果前面没有问号,则匹配一个或多个符号?

编辑:前一个表达式的问题或错误,如果它不处理类似??+or???+或 or的情况????+,换句话说,它不处理?s 用于逃避自己的情况。

我们可以通过注意如果?前面有一个奇数个,+那么最后一个肯定会逃避这个问题,+所以我们不能分裂,但是如果?前面有一个偶数个加号,那么那些抵消每个留下+所以我们应该围绕它分裂。

根据前面的观察,我们应该得出一个表达式,它仅在 a 前面有偶数个问号+ 时才匹配,这里是:?

(?<!(^|[^?])(\?\?)*\?)\+
于 2013-08-26T12:09:38.517 回答
1
string[] lines = Regex.Split(data, @"\+"); 

能满足要求吗??

这是转义“?”的编辑 在“+”之前。

string[] lines = Regex.Split(data, @"(?<!\?)[\+]+"); 

'+' 结尾将匹配多个连续出现的分隔符 '+'。如果你想要空白,而不是。

string[] lines = Regex.Split(data, @"(?<!\?)[\+]"); 
于 2013-08-26T12:05:47.140 回答