使用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分隔符应该是什么样子。
我可以看出,只有在加号+
前面没有问号?
的情况下,您才希望将其拆分为加号。这可以使用以下方法完成:
(?<!'?)'+
如果一个或多个+
符号前面没有问号?
,则这与它们匹配。
编辑:上一个表达式的问题或错误,如果它不能处理像??+
、???+
或????+
这样的情况,换句话说,它不能处理?
用来自行转义的情况。
我们可以通过注意到,如果在+
之前有奇数个?
,那么最后一个肯定在逃离+
,所以我们不能分裂,但如果在加号之前有偶数个?
,那么这些抵消了,每个都离开了+
,所以我们应该围绕它分裂
根据前面的观察,我们应该得出一个匹配+
的表达式,前提是它前面有偶数个问号?
,这里是:
(?<!(^|[^?])('?'?)*'?)'+
string[] lines = Regex.Split(data, @"'+");
它符合要求吗??
以下是用于转义"?"的编辑在"+"之前。
string[] lines = Regex.Split(data, @"(?<!'?)['+]+");
"+"结束-结束将与分隔符"+"的多次连续出现相匹配。如果你想要空白。
string[] lines = Regex.Split(data, @"(?<!'?)['+]");