2

我有一个可以通过迭代解决的问题,但我想知道是否有使用正则表达式的更优雅的解决方案和split()

我有一个字符串(excel放在剪贴板上),本质上是逗号分隔的。需要注意的是,当单元格值包含逗号时,整个单元格会用引号括起来(大概是为了转义该字符串中的逗号)。示例字符串如下:

123,12,"12,345",834,54,"1,111","98,273","1,923,002",23,"1,243"

现在,我想优雅地将此字符串拆分为单个单元格,但问题是我不能使用以逗号作为分隔符的正常拆分表达式,因为它会拆分值中包含逗号的单元格。另一种看待这个问题的方法是,如果逗号前面有偶数个引号,我只能用逗号分割。

这很容易用循环解决,但我想知道是否有一个正则表达式.split 函数能够捕获这个逻辑。为了解决这个问题,我为逻辑构造了确定性有限自动机 (DFA)。

替代文字

现在的问题被简化为以下问题:有没有办法拆分这个字符串,以便在 DFA 中每次达到最终状态(此处为状态 4)时产生一个新的数组元素(对应于 /s)?

4

2 回答 2

0

使用正则表达式(未转义):(?:(?:"[^"]*")|(?:[^,]*))

使用它并调用 .NET 的 Regex.Matches() 或其他平台中的类似物。

您可以将上述内容进一步扩展为:^(?:(?:"(?<Value>[^"]*)")|(?<Value>[^,]*))(?:,(?:(?:"(?<Value>[^"]*)")|(?<Value>[^,]*)))*$

这将在 1 次中解析整个字符串,但您需要命名组和每个组的多捕获才能工作(.NET 支持它)。

于 2010-12-16T15:10:31.193 回答
0

符合条件的逗号后面还有偶数个引号,并且 VBScript确实支持前瞻。尝试对此进行拆分:

",(?=(?:[^""]*""[^""]*"")*[^""]*$)"
于 2010-12-17T03:31:19.707 回答