世界上为什么会有正则表达式这么反人类的玩意儿? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 成的内容
snoopy1024
V2EX    程序员

世界上为什么会有正则表达式这么反人类的玩意儿?

  •  
  •   snoopy1024 2019-03-04 16:36:08 +08:00 via Android 24512 次点击
    这是一个创建于 2418 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如果不是必须用,尽量不用这玩意儿… 学也不想学,学了后又忘得快。 今天有个需求要写正则,吐槽一下…

    第 1 条附言    2019-03-05 12:21:05 +08:00
    我快被你们喷死了, 需求解决了,正则的确是最简洁和高效率的办法。之前硬着头皮认真学过,只是平时没咋用,很容易遗忘,每次看别人写的简直头大,感谢楼下大佬们提供的工具。
    170 条回复    2019-03-06 10:26:01 +08:00
    1  2  
    Patrick95
        1
    Patrick95  
       2019-03-04 16:50:50 +08:00   44
    写正则还好,读正则才是痛苦的事。
    正则表达式是可写不可读的。
    nfroot
        2
    nfroot  
       2019-03-04 16:59:31 +08:00   1
    不是反人类啊,是反程序员。。。最反的是重构程序员
    misaka19000
        3
    misaka19000  
       2019-03-04 17:00:45 +08:00
    正则本来就应该尽量避免使用
    lihongjie0209
        4
    lihongjie0209  
       2019-03-04 17:01:28 +08:00
    要不你自己写 if else, 要不用正则表达式, 它帮你生成 if else。
    maemual
        5
    maemual  
       2019-03-04 17:01:35 +08:00
    写的人爽了,后面的人痛苦
    RIcter
        6
    RIcter  
       2019-03-04 17:01:46 +08:00
    啊,我感觉挺好用的啊,不然你怎么处理模式化数据?
    DoveAz
        7
    DoveAz  
       2019-03-04 17:01:55 +08:00
    要是没有正则,邮箱手机号啥的验证起来更麻烦了
    syahd
        8
    syahd  
       2019-03-04 17:02:32 +08:00 via Android
    你就假装没有他,然后再用别的方法实现同样的功能呗,又没有人逼着你用。
    araraloren
        9
    araraloren  
       2019-03-04 17:02:36 +08:00
    了解一下 Perl 6 的 grammar 么。。
    icered
        10
    icered  
       2019-03-04 17:02:45 +08:00
    有啥更好的能取代正则的方法吗,接触少,感觉正则用起来挺灵活。。(主要是组合方式多)
    torment5524
        11
    torment5524  
       2019-03-04 17:03:33 +08:00
    用起来好用,就是场景毕竟固定,不是经常写,每次写都会忘记怎么写。。。。需要先查资料
    wanglufei
        12
    wanglufei  
       2019-03-04 17:04:43 +08:00 via Android
    每次用都要现查 api,没必要记
    ooonme
        13
    ooonme  
       2019-03-04 17:05:38 +08:00
    正则造福一方文本数据工程师
    tvallday
        14
    tvallday  
       2019-03-04 17:06:34 +08:00 via Android
    这个在特定场景,可以省很多时间和金钱。
    jdhao
        15
    jdhao  
       2019-03-04 17:06:58 +08:00 via Android
    确实经常忘!上周还专门总结了一下 sublime text 里面的正则表达式常用语法,https://jdhao.github.io/2019/02/28/sublime_text_regex_cheat_sheet/
    wenzhoou
        16
    wenzhoou  
       2019-03-04 17:11:47 +08:00 via Android   2
    wenzhoou
        17
    wenzhoou  
       2019-03-04 17:12:39 +08:00 via Android   1
    可以帮你解析正则表达式, 无废话。
    hellowes
        18
    hellowes  
       2019-03-04 17:12:57 +08:00
    菜鸡只会喷技术,有这力气不去看教程
    U7Q5tLAex2FI0o0g
        19
    U7Q5tLAex2FI0o0g  
       2019-03-04 17:13:33 +08:00
    用的不多,要用就查手册
    bilibilifi
        20
    bilibilifi  
       2019-03-04 17:13:38 +08:00
    感觉比起写等价的自动机还是正则表达式更方便吧
    jydeng
        21
    jydeng  
       2019-03-04 17:14:02 +08:00   8
    因为正则要解决的问题很反人类
    ochatokori
        22
    ochatokori  
       2019-03-04 17:14:45 +08:00 via Android
    刚开始接触整夜的时候我也是这样想的
    真香
    毕竟处理文本真的很方便
    gouchaoer2
        23
    gouchaoer2  
       2019-03-04 17:14:57 +08:00
    如果没有正则你写的东西读起来会更加困难
    lixuedong
        24
    lixuedong  
       2019-03-04 17:14:58 +08:00
    我倒觉得正则表达式很好用
    没有正则得浪费多少精力
    May725
        25
    May725  
       2019-03-04 17:16:30 +08:00
    真香
    wxsm
        26
    wxsm  
       2019-03-04 17:17:00 +08:00   1
    世界上为什么会有正则表达式这么反人类的玩意儿?

    真香。
    l00t
        27
    l00t  
       2019-03-04 17:17:43 +08:00
    我文本编辑器里查找替换都用正则表达式。没了正则表达式那操作起来得多麻烦啊。
    zhang1215
        28
    zhang1215  
       2019-03-04 17:18:15 +08:00
    真香警告
    yaodd
        29
    yaodd  
       2019-03-04 17:19:16 +08:00   1
    用完之后会说,世界上竟然有正则表达式这么神奇的东西!
    reus
        30
    reus  
       2019-03-04 17:19:29 +08:00
    你可以自己写一堆 if 啊,又没人阻止你。说不好读的,你那一堆 if 就好读了?
    再说了,难道你不会加注释吗?
    无能就不要开口。
    Cbdy
        31
    Cbdy  
       2019-03-04 17:19:45 +08:00 via Android
    没有掌握正确的学习方法的表现
    yaodd
        32
    yaodd  
       2019-03-04 17:20:40 +08:00
    反正是工具而已,普通人偶尔用下用完就丢也没多大关系,经常用到的人自己会很熟练
    vus520
        33
    vus520  
       2019-03-04 17:21:22 +08:00   1
    就那么几个点,能比五笔复杂?
    akira
        34
    akira  
       2019-03-04 17:22:03 +08:00
    数学才是反人类的
    boris1993
        35
    boris1993  
       2019-03-04 17:22:06 +08:00 via Android
    我写正则的时候,先到 playground 里一边测一边写,放代码里的时候肯定注释清楚匹配哪些数据并给出对应示例,然后就放在那再也不动
    ifaii
      &nsp; 36
    ifaii  
       2019-03-04 17:22:56 +08:00 via iPhone
    写还可以 读就很痛苦
    Tonni
        37
    Tonni  
       2019-03-04 17:29:08 +08:00   4
    我们团队规定写正则的时候必须要用注视描述清楚,最好贴上 https://regex101.com 上面的测试 case。
    imdong
        38
    imdong  
       2019-03-04 17:33:37 +08:00
    正则表达式是一种工具啊,而且熟悉以后写正则的过程其实可以很享受。
    当时,正则表达式是不可读的,但是有一堆工具可以辅助啊。
    所以,我感觉正则表达式在很多方面是解决问题的利器。
    只是,只是要看你怎么利用这个了而已。
    ballshapesdsd
        39
    ballshapesdsd  
       2019-03-04 17:35:19 +08:00
    真香警告
    janxin
        40
    janxin  
       2019-03-04 17:35:31 +08:00
    正则比较讨厌的是看别人写的正则 2333
    lhx2008
        41
    lhx2008  
       2019-03-04 17:36:19 +08:00 via Android
    如果是结构化文档不需要正则,其实开发中用到的也不多吧
    msg7086
        42
    msg7086  
       2019-03-04 17:45:03 +08:00
    正则应该是 Automata theory 的演化。这货还演化出了编译原理这玩意儿。所以没有正则的话,连编程语言也就一起没了。
    annielong
        43
    annielong  
       2019-03-04 17:48:00 +08:00
    写的时候真痛苦,用起来真香
    masker
        44
    masker  
       2019-03-04 17:48:22 +08:00 via Android
    还行啊…基本的无非就几个元字符,再深一点就环视之类的
    saulshao
        45
    saulshao  
       2019-03-04 17:48:32 +08:00
    正则表达式其实是提供给程序用的东西,并不是给人读的。
    因此让你写你当然痛苦,写出一串正则表达式,跟你按照相同的逻辑写一大堆 if-else 消耗的精力是完全一致的。
    只是读你自己写的结果,更加痛苦......
    但是程序员不就是干这个的么?
    0ZXYDDu796nVCFxq
        46
    0ZXYDDu796nVCFxq  
       2019-03-04 17:51:35 +08:00 via Android
    我们最近有一项工作是把几千条正则重写
    因为新引擎支持更高效的规则,部分正则用新规则,部分正则简化成原正则的超集
    zhuangzhuang1988
        47
    zhuangzhuang1988  
       2019-03-04 17:58:43 +08:00
    因为 linux 的狗屁哲学 一切皆文本
    而不是 windows 的 能结构化处理的结构化
    ex: linux 一堆破 shell vs powershell
    lihongjie0209
        48
    lihongjie0209  
       2019-03-04 18:03:02 +08:00
    @zhuangzhuang1988 还真有人用 powershell 啊
    tux
        49
    tux  
       2019-03-04 18:05:32 +08:00
    因为不搞复杂,码狗工资就不会这么高了,前辈们的一片苦心
    tiaod
        50
    tiaod  
       2019-03-04 18:06:59 +08:00
    不用正则表达式用啥? if else 写一大串?
    12101111
        51
    12101111  
       2019-03-04 18:07:19 +08:00 via Android   1
    楼主要不看看 形式语言与自动机 ?
    pkokp8
        52
    pkokp8  
       2019-03-04 18:09:00 +08:00 via Android
    ifelse 不能增加你的工资
    reg exp 也不行,但可以提高你的竞争力
    turingcat
        53
    turingcat  
       2019-03-04 18:11:41 +08:00
    正则一时爽,维护火葬场!
    kenX
        54
    kenX  
       2019-03-04 18:12:20 +08:00
    分享一个正则工具
    kenX
        55
    kenX  
       2019-03-04 18:12:38 +08:00   3
    @kenX
    分享一个正则工具,https://regexr.com/
    zhuangzhuang1988
        56
    zhuangzhuang1988  
       2019-03-04 18:13:07 +08:00
    @lihongjie0209 对啊, 微软的宣传部门真应该以死谢罪,东西超前那么多
    letianqiu
        57
    letianqiu  
       2019-03-04 18:16:58 +08:00
    @msg7086 这么多回复只有你说到点上了。如果没有自动机理论的研究,现在应该还是 assembly 的天下。
    fyyz
        58
    fyyz  
       2019-03-04 18:20:10 +08:00
    没人逼你用啊,你自己写代码解析字符串吧。
    weixiangzhe
        59
    weixiangzhe  
       2019-03-04 18:20:29 +08:00 via iPhone
    正则就是 读起来难 写还好
    herozzm
        60
    herozzm  
       2019-03-04 18:22:34 +08:00 via iPhone
    这个是宝贝疙瘩
    SorcererXW
        61
    SorcererXW  
       2019-03-04 18:22:52 +08:00
    正则表达式好就好在有一大堆可以抄,比如手机号码、邮箱,写不来就上网上抄就好了,保证可用
    如果没有正则表达,让菜鸟程序员手写代码验证手机号码、邮箱,可能出现地问题还要多
    另外,正则语法相对简单,不会编程也能写,让非程序员也能进行定制
    sunnyadamm
        62
    sunnyadamm  
       2019-03-04 18:24:52 +08:00 via Android
    这东西读的时候各种吐槽,用的时候,嗯,真香
    mon6912640
        63
    mon6912640  
       2019-03-04 18:25:45 +08:00 via Android
    你再想想,没有正则,你来写个字符串匹配逻辑试试?
    更不用说正则表达式是跨语言平台的了,不用正则表达式的话,同一个匹配规则,换了平台还得重新写一遍
    lihuoqingfly
        64
    lihuoqingfly  
       2019-03-04 18:25:54 +08:00   1
    真香
    ipwx
        65
    ipwx  
       2019-03-04 18:26:42 +08:00
    因为需要正则表达式的地方,你不用的话,写出来的程序更难读、更难维护。
    across
        66
    across  
       2019-03-04 18:28:19 +08:00
    这个东西用处很大

    唯一的问题就是你说的。当初我写的时候看了一下午的说明,看完了写好了,一个月后回来修改

    完了,完全看不懂自己写的啥了。
    AngryPanda
        67
    AngryPanda  
       2019-03-04 18:32:25 +08:00 via Android
    懂了就不反人类了。英语也反人类
    l00t
        68
    l00t  
       2019-03-04 18:33:14 +08:00
    @mon6912640 #63 跨语言平台??几乎每个语言的正则实现都不一样,如何跨语言平台?
    crazycen
        69
    crazycen  
       2019-03-04 18:33:44 +08:00
    解决一个问题,总会带来新的问题!
    ichou
        70
    ichou  
       2019-03-04 18:34:07 +08:00
    正则都不会写的话…… 你是怎么通过面试的
    jimmyczm
        71
    jimmyczm  
       2019-03-04 18:34:49 +08:00
    我读别人的正则就很痛苦
    casillasyi
        72
    casillasyi  
       2019-03-04 18:35:54 +08:00 via Android
    很多人真的是乱喷。正则能解决问题,但不代表他好用。这种符号系统的表达方式本身就是反人类的。当年汇编的时代,有一部分人闷头把他当圣经学习,有人觉得他他太反人类,所以开发了高级语言。
    cyspy
        73
    cyspy  
       2019-03-04 18:37:32 +08:00
    手改 csv 爽的要死
    casillasyi
        74
    casillasyi  
       2019-03-04 18:43:22 +08:00
    @mon6912640 残酷的是,每个平台你真的得重写一遍
    bwangel
        75
    bwangel  
       2019-03-04 18:56:54 +08:00
    https://regexper.com/

    希望对你有帮助。

    另外对于这种难读的代码,建议多写单元测试。单元测试尽量功能简单,代码繁琐,每个 testcase 只测试一个东西,一个 testcase 代码量尽量不超过 15 行,阅读这段代码的人(很有可能是两个月的你)通过单元测试可以了解到你想干啥?

    当然也可以写注释,但是注释很有可能在经过半年时间后,就与代码完全不同步了。
    laodao1990
        76
    laodao1990  
       2019-03-04 18:58:22 +08:00
    挺爽啊
    不光写程序可以用,查日志查各种文本的时候也可以用啊
    xiyiailoli
        77
    xiyiailoli  
       2019-03-04 19:07:17 +08:00 via Android
    还好吧,只是读别人的正则,有时候真的脑仁疼
    Raymon111111
        78
    Raymon111111  
       2019-03-04 19:08:15 +08:00
    因为方便
    ymj123
        79
    ymj123  
       2019-03-04 19:08:16 +08:00 via Android
    是你的需求反人类吧?
    reus
        80
    reus  
       2019-03-04 19:21:12 +08:00
    @casillasyi 那你“发明”一个高级语言来描述正则所表达的意思呗。
    youyaang
        81
    youyaang  
       2019-03-04 19:23:40 +08:00
    真香
    xrui
        82
    xrui  
       2019-03-04 19:25:18 +08:00 via Android
    我是在形式语言,讲到正则表达式的时候,才发现这两个同名的东西真的就是一个东西

    可以说没有正则表达式就没有形式语言与自动机理论这一套,而没有 CFG 就没有高级语言编译器,也就没有高级语言了
    lulinux
        83
    lulinux  
       2019-03-04 19:27:28 +08:00 via Android
    为了提高检索效率
    grewer
        84
    grewer  
       2019-03-04 19:27:45 +08:00
    是真滴好用
    kxct
        85
    kxct  
       2019-03-04 19:31:55 +08:00   2
    当你决定用正则表达式解决一个问题时,你就有两个问题了
    bumz
        86
    bumz  
       2019-03-04 19:34:58 +08:00
    好啊,那你别用正则表达式和写好的正则引擎,手写 DFA 好了
    先手写一个判断一个数是不是 2147483647 的倍数的 DFA 练练手?
    iAcn
        87
    iAcn  
       2019-03-04 19:35:35 +08:00 via Android
    正则表达式是个神奇的东西,每次都想着这次一定要学会,下次用的时候还是要去查。
    bumz
        88
    bumz  
       2019-03-04 19:38:47 +08:00
    @bumz #86 (不多,也就 2147483647 个状态和 4611686014132420609 个状态转移而已,相信楼主的实力,有限时间内一定能写完
    linxu
        89
    linxu  
       2019-03-04 19:41:36 +08:00 via Android
    这是一个技能。
    flynaj
        90
    flynaj  
       2019-03-04 19:45:39 +08:00 via Android
    楼主又是一个小学毕业的吧,基础不好就是这样的。多看看基础性的东西。
    littlewing
        91
    littlewing  
       2019-03-04 19:47:52 +08:00
    所以说你有啥更好的解决方案?
    no1xsyzy
        92
    no1xsyzy  
       2019-03-04 19:50:06 +08:00
    @zhuangzhuang1988 我去吃了个饭才想到你这 ex 是什么意思……
    Powershell 就是 REPL 不灵,要是 M$ 能把 PS 的 REPL 能写到及格,爬虫就再也不是 Python 了。另外就是太想当 Shell 了,导致对编程很不友好,反而是对 one-liner 友好得多。
    PS 也不是那么超前的东西,这些东西老早就有了。代码块来源于 Ruby (不清楚 Smalltalk 的情况);好像 Oberon 就是进程间通信传数据结构。
    stackexplode
        93
    stackexplode  
       2019-03-04 19:50:10 +08:00
    都有类似 regex101 这种好用的网站了,正则还不够好用吗,其他方案能比正则好用到哪里去?
    与其抱怨还不如把基础打好呢
    zhenhao
        94
    zhenhao  
       2019-03-04 19:51:23 +08:00
    正则不熟悉会觉得很难很乱,花时间熟悉后就简单了,和五笔输入法学习一样
    JamesMackerel
        95
    JamesMackerel  
       2019-03-04 19:57:46 +08:00 via iPhone
    正则的本质是状态机,如果不用正则,写一堆 if else 或者 switch case 照样能把你烦死。
    glfpes
        96
    glfpes  
       2019-03-04 20:00:47 +08:00
    正则表达式是一门魔法
    CEBBCAT
        97
    CEBBCAT  
       2019-03-04 20:13:18 +08:00 via Android
    乖乖,不用正则提取文本、格式验证那用啥?用 if else 啊?
    fetich
        98
    fetich  
       2019-03-04 20:14:23 +08:00
    没有正则,你会觉得更加反人类
    no1xsyzy
        99
    no1xsyzy  
       2019-03-04 20:15:55 +08:00
    另外,re.X 或者 re.VERBOSE,请
    hzw94
        100
    hzw94  
       2019-03-04 20:57:30 +08:00
    正则用起来很爽啊.
    1  2  
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     986 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 22:59 PVG 06:59 LAX 15:59 JFK 18:59
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86