【问题标题】:split string with regex using a release character and separators使用释放字符和分隔符使用正则表达式拆分字符串
【发布时间】:2013-08-26 11:57:22
【问题描述】:

我需要解析一个 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);

我不熟悉正则表达式,到目前为止还没有找到方法。 到目前为止我想出的最好的是

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

正确的结果应该是:

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

【问题讨论】:

  • 在您的示例数据中,我没有看到任何',那么您如何围绕这些进行拆分?
  • 我不想包含整个文件,所以示例数据只是已经解析的那些段中的一行。
  • 好的。所以你想在+前面没有?的地方拆分,对吧?

标签: c# regex


【解决方案1】:

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

(?<!\?)\+

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

编辑:如果前一个表达式不能处理??+???+????+ 之类的情况,则存在问题或错误,换句话说,它不能处理?s 用来逃避自己的情况。

我们可以通过注意如果+ 前面有奇数个? 来解决这个问题,那么最后一个肯定会转义+,所以我们不能拆分,但如果有偶数? 之前的一个加号然后那些抵消每个离开 + 所以我们应该围绕它分裂。

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

(?<!(^|[^?])(\?\?)*\?)\+

【讨论】:

  • 我运行了一个测试代码,到目前为止看起来还不错。当我 100% 时将其标记为答案。
  • 嗯,实际上多个相邻的分隔符很常见,“+++++++”是完全有效的,是的,它应该拆分成空字符串。
  • 我更新了正确的结果字符串,每个+ 符号应该产生一个新字符串,至少是一个空字符串。
  • 应该'??'被解释为单 '?' ? IOW,是 '??+' 一个 '?'后跟分隔符?
  • @Arkadiy 是吗?应该输出一个?我正在考虑运行替换“??”,“?”在每次解析完成时输出字符串上,我真的不希望出现像“??+”这样的场景,但这也是有效的,“???+”也是我猜的有效字符串,最后一个?此处的标记用作转义字符。
【解决方案2】:
string[] lines = Regex.Split(data, @"\+"); 

能满足要求吗?

这是转义“?”的编辑在“+”之前。

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

“+”结尾将匹配多个连续出现的分隔符“+”。如果你想要空格代替。

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

【讨论】:

  • 或者可能是单个'+'作为分隔符?第二个应该出现
  • 不,如果 + 号前面有问号,那么您应该将其评估为 + 号,而不是分隔符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-22
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
相关资源
最近更新 更多