我需要解析一个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('\'');
Run Code Online (Sandbox Code Playgroud)
然后将每个段拆分成段数据元素+,然后将段数据元素拆分为组件数据元素:.
var dataElements = segments[0].Split('+');
Run Code Online (Sandbox Code Playgroud)
由于使用了释放字符,因此无法正确解析上面的示例字符串.我有特殊的代码处理这个问题,但我认为这应该是可行的
Regex.Split(data, separator);
Run Code Online (Sandbox Code Playgroud)
我对Regex'es不熟悉,到目前为止找不到办法.我到目前为止最好的是
string[] lines = Regex.Split(data, @"[^?]\+");
Run Code Online (Sandbox Code Playgroud)
在+签名之前省略了字符.
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
Run Code Online (Sandbox Code Playgroud)
正确的结果应该是:
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
Run Code Online (Sandbox Code Playgroud)
所以问题是Regex.Split可行,并且正则表达式分隔符应该是什么样的.
+我可以看到,只有当加号前面没有问号(转义)时,您才想拆分加号?。这可以使用以下方法完成:
(?<!\?)\+
Run Code Online (Sandbox Code Playgroud)
+如果前面没有问号,则它会匹配一个或多个符号?。
编辑:上一个表达式的问题或错误,如果它不处理类似??+or???+或 or 的情况????+,换句话说,它不处理?s 用于转义自身的情况。
?我们可以通过注意到如果a 前面有奇数个,+那么最后一个肯定会转义+,所以我们不能拆分,但如果 a 前面有偶数个?加号,那么它们就会相互抵消,留下+so我们应该围绕它分裂。
根据之前的观察,我们应该得出一个+ 仅当a 前面有偶数个问号时才匹配 a 的表达式?,如下所示:
(?<!(^|[^?])(\?\?)*\?)\+
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1672 次 |
| 最近记录: |