使用正则表达式解析转义字符

时间:2014-08-06 14:35:26

标签: c# .net regex string csv

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

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

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

我已经提出了以下表达式,^,(?!\\,)$我曾希望找到逗号,但不会转义逗号。不幸的是,它没有用。

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

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, @"^,(?!\,)$");时,没有任何反应,我只得到一个包含整个字符串的元素数组。

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

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

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

(?<!...)是一个外观断言,意味着:不在之前

答案 2 :(得分:1)

这是使用负面观察的一个很好的例子:

(?<!\\),

<强> Working demo

enter image description here