我需要解析一个EDI文件,其中分隔符为+
,:
和'
符号,而转义(发布)字符为{{ 1}}。
你首先分成几个部分
?
然后每个段按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'es不熟悉,到目前为止找不到办法。 我到目前为止最好的是
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
所以问题是这对Regex.Split是可行的,正则表达式分隔符应该是什么样的。
答案 0 :(得分:4)
我可以看到,只有在问号+
之前没有(转义)之前,您才想要分开加号?
。这可以使用以下方法完成:
(?<!\?)\+
如果前面没有问号+
,则会匹配一个或多个?
个符号。
修改:如果上述表达式没有处理??+
或???+
或????+
等情况,则会出现问题或错误,换句话说,它没有处理?
被用来逃脱的情况。
我们可以通过注意到?
前面有奇数+
来解决这个问题,那么最后一个肯定会逃离+
,所以我们不能拆分,但是如果在加号前有偶数个?
,那么每个人都会取消+
,因此我们应该将其分开。
根据之前的观察,我们应该提出一个与+
匹配的表达式,只有前面有偶数个问号{{ 1}},这里是:
?
答案 1 :(得分:1)
string[] lines = Regex.Split(data, @"\+");
它会满足要求??
以下是转义'?'的编辑在'+'之前。
string[] lines = Regex.Split(data, @"(?<!\?)[\+]+");
结尾的'+'结尾将匹配分隔符'+'的多个连续出现。如果你想要白色空格。
string[] lines = Regex.Split(data, @"(?<!\?)[\+]");