使用释放字符和分隔符将正则表达式拆分为字符串

时间:2013-08-26 11:57:22

标签: c# regex

我需要解析一个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是可行的,正则表达式分隔符应该是什么样的。

2 个答案:

答案 0 :(得分:4)

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

(?<!\?)\+

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

修改:如果上述表达式没有处理??+???+????+等情况,则会出现问题或错误,换句话说,它没有处理?被用来逃脱的情况。

我们可以通过注意到?前面有奇数+来解决这个问题,那么最后一个肯定会逃离+,所以我们不能拆分,但是如果在加号前有偶数个?,那么每个人都会取消+,因此我们应该将其分开。

根据之前的观察,我们应该提出一个与+ 匹配的表达式,只有前面有偶数个问号{{ 1}},这里是:

?

答案 1 :(得分:1)

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

它会满足要求??

以下是转义'?'的编辑在'+'之前。

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

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

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