正则表达式问题请教

2021-06-23 05:47:12 +08:00
 jupiter157

有一个数据文件,每条记录都是逗号隔开,如果记录本身含有逗号,就用双引号引起来。请问怎么优雅地用正则表达式分割记录?

2177 次点击
所在节点    程序员
14 条回复
emric
2021-06-23 06:36:26 +08:00
[^\,]+|\".+\"
可行,但不知道是不是最优雅。
jupiter157
2021-06-23 07:05:36 +08:00
@emric 谢谢。测试无效,但是受你启发改成这样可行了:[^\,\"]+|\"[^\"]+\"
Mutoo
2021-06-23 07:13:50 +08:00
如果记录本身含双引号怎么办。233

ref:
https://datatracker.ietf.org/doc/html/rfc4180
toaruScar
2021-06-23 08:06:34 +08:00
可以用 lookahead 和 lookbehind ?
https://regular-expressions.mobi/lookaround.html?wlr=1
balabalaguguji
2021-06-23 09:34:21 +08:00
noqwerty
2021-06-23 09:38:23 +08:00
找个 csv parser 不香吗😂
mingl0280
2021-06-23 09:48:05 +08:00
找个 csv 解析库,csv 不仅有逗号问题的。还有引号重复的问题。例如
","作为值……
dongtingyue
2021-06-23 09:53:26 +08:00
先根据逗号分隔成数组,然后循环判断前后是否是引号再拼接。这样效率应该比正则快。
tsanie
2021-06-23 10:03:20 +08:00
数据文件以逗号分隔这类的最好存储的时候先 encode,如果控制不了来源的话那就找 parser 吧
wangyzj
2021-06-23 10:03:30 +08:00
(?!\")\,(?!\")
wangyzj
2021-06-23 10:04:09 +08:00
但我更喜欢 notepad 全局替换后再单独处理
不想费脑子
yuancoder
2021-06-23 10:14:12 +08:00
$str = 'aaaa","bbb,cccc",",dddd';

$arr = preg_split('/(?!"),(?!")/', $str);

print_r($arr);


--------------------------------


Array
(
[0] => aaaa","bbb
[1] => cccc","
[2] => dddd
)


这样可以吗
jindaxia
2021-06-23 10:22:30 +08:00
不就是 csv 格式吗?后缀改成 csv 用 excel 打开!
toaruScar
2021-06-23 10:44:34 +08:00
https://regex101.com/r/Xg0Qxq/1
这样连 Capture group 都整理好了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/785206

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX