【问题标题】:Parsing for escape characters with a regular expression使用正则表达式解析转义字符
【发布时间】:2014-08-06 14:35:26
【问题描述】:

我正在创建一个逗号分隔的脚本来存储项目的各种数据。

我的数据行的最后一部分始终是前面数据的摘要(它始终是除换行符之外的任何字符的字符串)。问题是我沿着逗号分割了整行,所以如果该行的摘要部分中有逗号,多余的逗号之后的任何内容也会被分割,这是我不想要的。

所以我想为逗号制作自己的转义字符。我认为最不容易出错的方法是使用正则表达式。

我想出了下面的表达式,^,(?!\\,)$,我希望它会查找逗号,而不是转义的逗号。不幸的是,它不起作用。

以下两行说明了我的数据是如何分离的。

01, 0, 80.0, 0x00100204, 0x00000000, 0x00000800, 0xFFFFF800, 0.02, 0.5, Channel 01: Voltage Offset\,\,\,comma 
02, 0, 80.0, 0x00100208, 0x00000000, 0x00000800, 0xFFFFF800, 0.02, 0.5, Channel 02: Voltage Offset

请注意,在第一行数据中,我有多余的逗号,用\,\,\,comma表示

但是当我调用Regex.Split(line, @"^,(?!\,)$"); 时,什么都没有发生,我只是得到一个包含我的整个字符串的单个元素数组。

【问题讨论】:

  • 为什么不使用 csv 解析器库呢?
  • 仅供参考 ^$anchors 匹配字符串的开头和结尾
  • @Selman22 我的脚本不是纯 CSV 文件;它有许多关键字和其他帮助分隔数据部分的东西
  • 由于结构是相同的,直到最后一部分,我将探索使用捕获组来捕获到两个组。然后你对每个部分做你需要做的事情。

标签: c# .net regex string csv


【解决方案1】:

这是一个使用负向回溯的好例子:

(?<!\\),

Working demo

【讨论】:

  • @audiFanatic 很高兴为您提供帮助。感谢您的打勾
【解决方案2】:

如果您想使用正则表达式,而不是拆分字符串,我建议您通过匹配以下正则表达式来捕获字段:

\s*((?:\\.|[^\\])+?)\s*(?:,\s*|$)

演示:http://regex101.com/r/lP8yE1/4

每个匹配都是一个字段,值是捕获组 1 的内容。

【讨论】:

  • 好吧,我最终必须拆分数据,以便我可以解析字符串并将它们转换为可以在我的代码中进行数学运算的数字变量。所以我不确定我是否可以使用捕获字段来做到这一点
  • @audiFanatic 在整行上调用Regex.Matches,每个字段将获得一个Match 对象。对于每场比赛,使用match.Groups[1].Value。这将包含您可以在代码中直接使用的字段值(没有逗号或周围的空格)(这些值在 regex101 演示页面上以绿色突出显示)。
【解决方案3】:

您可以使用这种模式来检查之前是否没有反斜杠:

Regex.Split(line, @"(?<!\\), ");

(?&lt;!...) 是一个后向断言,意味着:前面没有

【讨论】:

  • 最好检查逗号前有奇数个反斜杠。
  • @LucasTrzesniewski:由于文本字段是唯一可能包含反斜杠的字段,因此不需要它。
  • @CasimiretHippolyte 这并非在所有情况下都有效。逗号似乎逃脱了自己。这不是世界上最糟糕的事情,因为摘要在行尾,但如果我选择稍后重新排列,可能会很麻烦。例如,01, 0, 80.0, 0x00100204, 0x00000000, 0x00000800, 0xFFFFF800, 0.02, 0.5, Channel 01: Voltage Offset\, hello\, 222,,,comma
  • @audiFanatic:在这种情况下,忘记搜索转义的(或不转义的)逗号,并使用“,”进行有限的简单拆分。(因为您似乎总是有相同数量的字段) .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
相关资源
最近更新 更多