我在Tcl中使用以下行来解析以逗号分隔的字段行.可以引用某些字段,以便它们可以包含逗号:
set line {12,"34","56"}
set fresult [regsub -all {(\")([^\"]+)(\",)|([^,\"]+),} $line {{\2\4} } fields]
puts $fields
{12} {34} "56"
Run Code Online (Sandbox Code Playgroud)
(引用最后一个字段而不是括号,这有点奇怪,但这不是问题)
但是,当引号中有逗号时,它不起作用:
set line {12,"34","56,78"}
set fresult [regsub -all {(\")([^\"]+)(\",)|([^,\"]+),} $line {{\2\4} } fields]
puts $fields
{12} {34} "{56} 78"
Run Code Online (Sandbox Code Playgroud)
我希望:{12} {34} {56,78}
我的正则表达式有什么问题或者有什么东西正在进行吗?
小智 5
想到的一个选项是在TclLib中使用CSV功能.(没有理由重新发明轮子,除非你必须......)
http://tcllib.sourceforge.net/doc/csv.html
文件摘录
:: csv :: split? - 替代?线{sepChar,} {delChar"} CSV格式的线转换成包含在所述行中的值的列表.字符用来分隔值彼此可以由呼叫者经由sepChar来限定,但这是可选的默认为",".引用字符可由调用者定义,但这是可选的.默认为"".如果选项-alternate是spcified,则使用稍微不同的语法来解析输入.下面在FORMAT部分解释了此语法.