使用regex使用释放字符和分隔符拆分字符串

本文关键字:分隔符 拆分 字符串 字符 释放 regex 使用 | 更新日期: 2023-09-27 18:29:05

我需要解析一个EDI文件,其中分隔符为+:'符号,转义符(release)字符为?。您首先将拆分为多个部分

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);

我不熟悉Regex的,到目前为止也找不到这样做的方法。到目前为止,我提出的最好的是

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

省略了CCD_ 7符号之前的字符。

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是否可行,以及Regex分隔符应该是什么样子。

使用regex使用释放字符和分隔符拆分字符串

我可以看出,只有在加号+前面没有问号?的情况下,您才希望将其拆分为加号。这可以使用以下方法完成:

(?<!'?)'+

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

编辑:上一个表达式的问题或错误,如果它不能处理像??+???+????+这样的情况,换句话说,它不能处理?用来自行转义的情况。

我们可以通过注意到,如果在+之前有奇数个?,那么最后一个肯定在逃离+,所以我们不能分裂,但如果在加号之前有偶数个?,那么这些抵消了,每个都离开了+,所以我们应该围绕它分裂

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

(?<!(^|[^?])('?'?)*'?)'+
string[] lines = Regex.Split(data, @"'+"); 

它符合要求吗??

以下是用于转义"?"的编辑在"+"之前。

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

"+"结束-结束将与分隔符"+"的多次连续出现相匹配。如果你想要空白。

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