V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jupiter157
V2EX  ›  程序员

正则表达式问题请教

  •  
  •   jupiter157 · 2021-06-23 05:47:12 +08:00 · 2144 次点击
    这是一个创建于 1238 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    第 1 条附言  ·  2021-06-23 15:20:16 +08:00
    这该死的歧义,我的意思是整个记录用双引号引起来,而不是单单逗号引起来。
    这个和 CSV 文件很类似,但是我想试试自己用表达式解决一下。
    确定记录正文中不含有双引号,所以不用考虑双引号的歧义。
    第 2 条附言  ·  2021-06-23 15:28:32 +08:00
    我之前的思路是考虑逗号的前后环境,发现这样逻辑太复杂了,换个思路简单很多,即每个记录有两种情况:1 )不含逗号和双引号,2 )如果含有双引号,那么一定要两个成对
    14 条回复    2021-06-23 10:44:34 +08:00
    emric
        1
    emric  
       2021-06-23 06:36:26 +08:00
    [^\,]+|\".+\"
    可行,但不知道是不是最优雅。
    jupiter157
        2
    jupiter157  
    OP
       2021-06-23 07:05:36 +08:00
    @emric 谢谢。测试无效,但是受你启发改成这样可行了:[^\,\"]+|\"[^\"]+\"
    Mutoo
        3
    Mutoo  
       2021-06-23 07:13:50 +08:00
    如果记录本身含双引号怎么办。233

    ref:
    https://datatracker.ietf.org/doc/html/rfc4180
    toaruScar
        4
    toaruScar  
       2021-06-23 08:06:34 +08:00 via iPhone
    可以用 lookahead 和 lookbehind ?
    https://regular-expressions.mobi/lookaround.html?wlr=1
    balabalaguguji
        5
    balabalaguguji  
       2021-06-23 09:34:21 +08:00
    noqwerty
        6
    noqwerty  
       2021-06-23 09:38:23 +08:00 via Android
    找个 csv parser 不香吗😂
    mingl0280
        7
    mingl0280  
       2021-06-23 09:48:05 +08:00 via Android
    找个 csv 解析库,csv 不仅有逗号问题的。还有引号重复的问题。例如
    ","作为值……
    dongtingyue
        8
    dongtingyue  
       2021-06-23 09:53:26 +08:00
    先根据逗号分隔成数组,然后循环判断前后是否是引号再拼接。这样效率应该比正则快。
    tsanie
        9
    tsanie  
       2021-06-23 10:03:20 +08:00
    数据文件以逗号分隔这类的最好存储的时候先 encode,如果控制不了来源的话那就找 parser 吧
    wangyzj
        10
    wangyzj  
       2021-06-23 10:03:30 +08:00
    (?!\")\,(?!\")
    wangyzj
        11
    wangyzj  
       2021-06-23 10:04:09 +08:00
    但我更喜欢 notepad 全局替换后再单独处理
    不想费脑子
    yuancoder
        12
    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
        13
    jindaxia  
       2021-06-23 10:22:30 +08:00
    不就是 csv 格式吗?后缀改成 csv 用 excel 打开!
    toaruScar
        14
    toaruScar  
       2021-06-23 10:44:34 +08:00
    https://regex101.com/r/Xg0Qxq/1
    这样连 Capture group 都整理好了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1028 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 20:19 · PVG 04:19 · LAX 12:19 · JFK 15:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.