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

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

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

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

    第 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
    要是没有正则,邮箱手机号啥的验证起来更麻烦了
    whwq2012
        8
    whwq2012  
       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
    菜鸡只会喷技术,有这力气不去看教程
    littleylv
        19
    littleylv  
       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
        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   ·   实用小工具   ·   5937 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 02:02 · PVG 10:02 · LAX 18:02 · JFK 21:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.