cl-ppcre正则表达式引号转义方法咨询,用于CSV解析场景
问题解决
核心错误
你误用了ppcre:split函数:你写的正则是用来匹配CSV字段本身,而split是把正则匹配到的内容作为分隔符切掉,返回剩下的内容,所以你整个字符串都被正则匹配后,自然返回空列表,和引号转义无关。
正确实现方式
方案1:直接匹配所有CSV字段(更简单)
用ppcre:all-matches-as-strings直接提取所有匹配到的字段,Common Lisp字符串里双引号仅需单个反斜杠转义即可,示例代码如下:
(defparameter bads "\"AER\",\"BenderlyZwick\",\"Benderly and Zwick Data: Inflation, Growth and Stock returns\",31,5,0,0,0,0,5,\"https://vincentarelbundock.github.io/Rdatasets/csv/AER/BenderlyZwick.csv\",\"https://vincentarelbundock.github.io/Rdatasets/doc/AER/BenderlyZwick.html\"") ;; 匹配所有CSV字段,兼容空字段 (ppcre:all-matches-as-strings "(\"[^\"]*\"|[^,]*)" bads)
如果需要去掉字段首尾的引号和多余空格,可以后续加一层字符串处理即可。
方案2:用split按分隔符切割
如果你坚持要用split,需要把正则改成匹配不在引号内的逗号(也就是真正的字段分隔符),示例代码如下:
;; 匹配作为分隔符的逗号 (ppcre:split ",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)" bads)
补充说明
你之前测试的解析树写法本身没有问题,错误原因同样是误用了split函数,换成ppcre:all-matches或ppcre:all-matches-as-strings即可正常返回结果。
内容的提问来源于stack exchange,提问作者CL-USER
相关产品推荐
相关产品推荐

