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

大家都是怎么练习正则表达式的呢?

  •  
  •   szzhiyang · 2018-12-28 21:55:32 +08:00 · 13000 次点击
    这是一个创建于 2157 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我相信,想问这个问题的 V 友不止我一个。

    92 条回复    2019-05-23 12:50:03 +08:00
    ethanlu
        1
    ethanlu  
       2018-12-28 22:02:41 +08:00   ❤️ 1
    正则这东西会就行了,没事不会天天写,反正学会之后就写了两个,遇到要用的时候找个正则网站试几个样本,ok 啦。
    likuku
        2
    likuku  
       2018-12-28 22:05:11 +08:00   ❤️ 2
    尽量不用它,实在逃不掉的话,那就在线搜,反正各种在线 正则生成器 /测试器 足够多。

    想起以前某本正则的厚书的序言里提到:世上就两种人,学会正则一劳永逸;没学会正则的人

    没错,我就是不会正则的人
    alexmy
        3
    alexmy  
       2018-12-28 22:16:17 +08:00
    学了几次,又都忘了,最近打算写一个 golang 的工具库,包括正则的,顺带当练习下。
    szzhiyang
        4
    szzhiyang  
    OP
       2018-12-28 22:16:24 +08:00
    @likuku @ethanlu

    我越发感觉有必要去掌握正则表达式,因为我越发感受到它能大大提高处理文本和整理文件的效率。
    anguiao
        5
    anguiao  
       2018-12-28 22:19:34 +08:00
    没有特别系统地学过,不过一般碰到用正则的情况都不算特别复杂,都能写出来。
    largecat
        6
    largecat  
       2018-12-28 22:20:51 +08:00 via Android
    前前后后学了几次,每次看完就忘记了。
    所以平时尽量避免使用他,

    后来接触 scrapy,意外写了几个,会了,
    其他的就套用了
    ethanlu
        7
    ethanlu  
       2018-12-28 22:21:21 +08:00   ❤️ 10
    @szzhiyang #4 拿走不谢
    clino
        8
    clino  
       2018-12-28 22:22:45 +08:00
    kodos re ide
    lhx2008
        9
    lhx2008  
       2018-12-28 22:22:55 +08:00
    我每次写都要看那个手册,啥正向肯定预查、正向否定预查、反向肯定预查、反向否定预查你们真的记得住吗?
    szzhiyang
        10
    szzhiyang  
    OP
       2018-12-28 22:28:47 +08:00
    @ethanlu

    非常感谢,不过我主要想知道该如何练习并熟记表格中的内容,您对此有哪些建议呢?
    ethanlu
        11
    ethanlu  
       2018-12-28 22:30:57 +08:00
    @szzhiyang #10 我是看这本学的,你可以找找看,[正则表达式入门经典].(美)瓦特.扫描版。我一个不是程序员的人都能学会,练一练咯。
    innoink
        12
    innoink  
       2018-12-28 22:31:27 +08:00 via Android
    查表,测试
    jingyulong
        13
    jingyulong  
       2018-12-28 22:33:42 +08:00 via iPhone
    熟练就是多用。找找本书,把基础过一遍。懂得原理,写起来就得心应手了。
    Coolwinds
        14
    Coolwinds  
       2018-12-28 22:34:35 +08:00   ❤️ 7
    正则是个很神奇的东西,每次复习完一段时间不用必忘
    goreliu
        15
    goreliu  
       2018-12-28 22:37:10 +08:00 via Android
    会用就行,如果用得频繁自然就记住了,不然的话不管怎么记过一阵也得忘,没必要做无用功。
    EricXuu
        16
    EricXuu  
       2018-12-28 22:40:38 +08:00 via Android   ❤️ 2
    lrxiao
        17
    lrxiao  
       2018-12-28 22:41:54 +08:00
    刚想说 Regex Golf (
    autoxbc
        18
    autoxbc  
       2018-12-28 22:46:30 +08:00
    如果说不要炫技是个公认的准则,那么不要在正则里炫技也是同样道理
    amenging
        19
    amenging  
       2018-12-28 22:49:30 +08:00
    用用就熟了,关键还是在做题或者实际项目中要用到..
    Cbdy
        20
    Cbdy  
       2018-12-28 22:51:22 +08:00 via Android
    你需要理解正则的原理,这样就不需要练习了
    KasuganoSoras
        21
    KasuganoSoras  
       2018-12-28 22:52:24 +08:00 via Android
    不会就上 Google 找,我学了这么久也就记住了个匹配中英文,数字,特殊字符,指定长度
    junjieyuanxiling
        22
    junjieyuanxiling  
       2018-12-28 23:02:44 +08:00 via Android
    记住几个常用的就够了吧,有需要再找。
    seki
        23
    seki  
       2018-12-28 23:03:33 +08:00
    需要用的时候,打开 google 和 regex101,开始不断尝试
    qz357
        24
    qz357  
       2018-12-28 23:04:48 +08:00 via iPhone   ❤️ 1
    推荐一个神奇 https://regex101.com
    xiangyuecn
        25
    xiangyuecn  
       2018-12-28 23:07:29 +08:00   ❤️ 2
    感觉一个小时学会简单正则表达式(忘不了),能解决 80%需求。剩下容易忘、难懂的了解一下就行了,像楼上说的这部分学会了也容易忘记。。

    简单的:
    ^$ 开头结尾
    *+? 吃豆人
    ? 阻止吃豆
    .\w\d\s 那些大写的就算了 算是取反
    \b 好东西,不过好难理解
    ()(?:) 分组,拒绝分组
    | 或运算符?
    [] 难用的一币
    {} 感觉挺有用,其实用的少,*+?用的多

    不常用的:
    剩下的都好高级的好吧,难学难写,各种环境下还不一定支持,学会了可以解决剩下的 20%需求
    Navee
        26
    Navee  
       2018-12-28 23:24:12 +08:00
    开始是准备学的,发现怎么都学不会
    后来工作每天都要用,莫名其妙就会了
    neptuno
        27
    neptuno  
       2018-12-28 23:26:34 +08:00
    学了就忘说明并不需要经常用到正则,等到要经常用的时候自然就会了
    piokhj
        28
    piokhj  
       2018-12-28 23:59:20 +08:00
    不要学,不要记,直接用。
    正则可以解决很多问题,每天都能用上。
    momoplutoliu
        29
    momoplutoliu  
       2018-12-29 00:13:21 +08:00
    程序员都有 sublime text, vscode, 各种 IDE 吧?
    那不简单:
    - 把要处理的文本打开
    - ctrl+f,选择正则匹配模式
    - 查表,不断的试,编译器的高亮就是反馈

    基本的.*+?()[]^$这些符号含义记清楚,我也没有专门的去针对训练,
    用到的时候,自己先试,试不出来问 google,再试
    wivwiv
        30
    wivwiv  
       2018-12-29 00:43:19 +08:00 via iPhone   ❤️ 6
    程序员遇到一个问题 好像可以用正则解决?
    好了,现在变成两个问题了
    Greatshu
        31
    Greatshu  
       2018-12-29 01:16:00 +08:00   ❤️ 1
    写 B 站弹幕屏蔽列表
    komorebiSaw
        32
    komorebiSaw  
       2018-12-29 01:38:53 +08:00
    会用基本的, 但原则是能不用就不用
    以前见过别人 n 个文件, 每个文件几百行正则 惊为天书
    Sparetire
        33
    Sparetire  
       2018-12-29 02:15:28 +08:00 via Android   ❤️ 1
    学完编译原理,简单的正则不需要查也会写了,扩展的正则特性,用到再查查,多用几次也差不多都记住了
    sola97
        34
    sola97  
       2018-12-29 02:22:25 +08:00 via Android
    B 站弹幕屏蔽列表+1,写着多了就熟了
    mario85
        35
    mario85  
       2018-12-29 02:50:53 +08:00 via iPhone
    多玩玩 grep
    Telegram
        36
    Telegram  
       2018-12-29 03:54:45 +08:00 via iPhone
    这玩意就是要用了现查现用就行了
    xxgirl2
        37
    xxgirl2  
       2018-12-29 04:05:39 +08:00
    正则好学
    关键是用到它的那几个命令的参数一直记不住
    dangyuluo
        38
    dangyuluo  
       2018-12-29 06:49:07 +08:00
    学习正则就像是学习骑自行车一样,光看理论没什么用,需要的时候花两个小时看一下就可以了。然后另一点就是多看别人的正则是怎么写的。
    tachikomachann
        39
    tachikomachann  
       2018-12-29 08:07:11 +08:00 via Android
    用 vim。。。
    Akiyu
        40
    Akiyu  
       2018-12-29 08:25:43 +08:00
    多用啊, 用着用着就会了
    你想学的话有两本书可以推荐

    初学者: 正则表达式必知必会
    评价: 这本书很小巧, 地铁里面可以读.
    如果你不关心原理, 只是想快速使用的话, 这本最合适不过了

    进阶: 精通正则表达式
    评价: 这本书就是比较权威的书籍了.
    上面那本书的作者在引言中都推荐了这本书, 可见此书的含金量有多高
    适合对正则表达式有一定理解了, 并且工作中常用到, 想进阶的人看
    OldPanda
        41
    OldPanda  
       2018-12-29 08:26:57 +08:00
    不练习,因为正则并没有那么常用,需要的时候就到 https://pythex.org/ 现拼一个
    reself
        42
    reself  
       2018-12-29 08:34:53 +08:00 via Android
    学习编译原理。正则的三种基本运算是连接、选择和闭包,其他运算的可以视为语法糖了,虽然表达力有限,大部分需求没啥问题了。加一个非运算。
    ctro15547
        43
    ctro15547  
       2018-12-29 08:48:00 +08:00
    桌面常放 7 楼那张图,要用了拿出来看,找 Notepad++试一下,你说什么要判断要筛选条件?我都是 re 个大概然后交给 if:else:去干的。。
    bumz
        44
    bumz  
       2018-12-29 09:10:15 +08:00
    先学习形式语言与自动机相关理论
    学到正则语言,ε-NFA,正则表达式就够了

    然后可以自己用 DFA 实现一个严格线性时间的正则引擎,就像 re2

    到这一步你就是世界上最懂正则表达式的人之一了

    许多正则引擎还有一些扩展功能,比如 backtracking,backreference 之类的,这些扩展打破了正则语言的界限,原则上已经应该用 CFL 乃至 CSL 甚至 RE 的识别器了
    bumz
        45
    bumz  
       2018-12-29 09:12:43 +08:00   ❤️ 1
    给大家出一道题,看看你是否会写正则表达式

    1) 请构造一个正则表达式,判断任意给定的数(十进制字符串)是否是 13 的倍数(如 0, 13, 26...)
    2) 对于任意给定的 m (m >= 2),编写一个程序,生成一个识别 m 的倍数的数(十进制字符串)的正则表达式。
    usingnamespace
        46
    usingnamespace  
       2018-12-29 09:14:05 +08:00 via iPhone
    @reself 呵呵呵 你们这些扯编译原理的什么鬼。本来人家就是一个问题,你这瞬间是两个问题了。国内有的计算机相关专业有的都直接不开编译原理了好吗?一方面主要是都上成了 parsing+汇编入门,汇编又学的不如微机。parsing 也就那样了,正则确实会有体现,但是人家的回答下这样说是不是没意义了
    woodensail
        47
    woodensail  
       2018-12-29 09:17:07 +08:00
    正则基本上除了平衡组其他的都挺简单的,顶多是零宽断言那边符号组合容易忘,但是规则不难。
    平衡组我是真搞不明白。
    woodensail
        48
    woodensail  
       2018-12-29 09:20:17 +08:00
    @bumz 自动机……
    mengyang624
        49
    mengyang624  
       2018-12-29 09:25:52 +08:00
    我脑子里能记住的就只有一个 |
    其他全部靠搜索、测试。。。
    ioven
        50
    ioven  
       2018-12-29 09:26:18 +08:00
    开始看了 30 分钟入门,知道大概可以解决什么问题

    之后碰到问题现查解决方法,用的多了自然就记住了
    DavidNineRoc
        51
    DavidNineRoc  
       2018-12-29 09:28:36 +08:00
    当初去爬妹子图片的时候现学的,现在还忘不了。你可以试试。
    CallMeReznov
        52
    CallMeReznov  
       2018-12-29 09:57:35 +08:00
    https://regexone.com/
    https://regexcrossword.com/

    专门有正则游戏网站的.从浅到深.
    lovelybear
        53
    lovelybear  
       2018-12-29 10:04:34 +08:00
    现学现卖,现用现查
    koalli
        54
    koalli  
       2018-12-29 10:07:13 +08:00
    记不住,每次要用的时候不断地猜。。。
    kingwl
        55
    kingwl  
       2018-12-29 10:12:07 +08:00
    正则都可以转化成一个自动机 了解这一点之后就剩下构造状态和转移还有一点基础的语法了

    就比如 @bumz 出的这个题目
    Honwhy
        56
    Honwhy  
       2018-12-29 10:18:58 +08:00
    我读过精通正则表达式这本书,快忘得差不多了
    正则表达式有方言区别,有语言实现上的差异
    kingwl
        57
    kingwl  
       2018-12-29 10:34:10 +08:00
    @Honwhy 指望背....是肯定记不住的.....
    asj
        58
    asj  
       2018-12-29 10:35:55 +08:00
    用 vi
    glouhao
        59
    glouhao  
       2018-12-29 10:37:26 +08:00 via Android
    我在火车头上练
    abc635073826
        60
    abc635073826  
       2018-12-29 11:00:47 +08:00
    🔍
    wobuhuicode
        61
    wobuhuicode  
       2018-12-29 11:02:07 +08:00
    没把规则记清楚,写太多也没用
    zhaogaz
        62
    zhaogaz  
       2018-12-29 11:10:30 +08:00
    额,先理解正则的设计模型。

    我理解的正则里面就是,做限定的,是什么,不是什么,要么是给定范围,或者,多次重复,单次重复啊,匹配字符串前后用零宽断言啊。

    理解模型之后,剩下的就是查手册了。 找自己需要的东西。
    geelaw
        63
    geelaw  
       2018-12-29 11:14:38 +08:00
    @bumz #45 我没有做很强的表达式优化,写出了一个长达 62.1 MB ( 65,152,515 个字符)的正则表达式匹配 13 的倍数(只匹配不带前导零、不带符号的正数)。输出的表达式使用计算机科学的常用语法(只用 | OR, () GROUP 和连接、空串)。

    https://gist.github.com/GeeLaw/be3aec94a6ba7c3817ef2e16d261f616

    匹配 3 的倍数是:

    (((2|5|8)(0|3|6|9)*(2|5|8)|1|4|7)((1|4|7)(0|3|6|9)*(2|5|8)|0|3|6|9)*((1|4|7)(0|3|6|9)*(1|4|7)|2|5|8)|(2|5|8)(0|3|6|9)*(1|4|7)|3|6|9)(((2|5|8)(0|3|6|9)*(2|5|8)|1|4|7)((1|4|7)(0|3|6|9)*(2|5|8)|0|3|6|9)*((1|4|7)(0|3|6|9)*(1|4|7)|2|5|8)|(2|5|8)(0|3|6|9)*(1|4|7)|0|3|6|9)*

    注意该程序经常输出非最优解,例如对于 5 的倍数,最简单的解是 5|(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*(5|0),该程序输出的是一个长达 2899 字符的表达式。
    afirefish
        64
    afirefish  
       2018-12-29 11:32:10 +08:00
    amwyyyy
        65
    amwyyyy  
       2018-12-29 11:32:24 +08:00
    分享下公司同事的分享,里面有些练习题挺不错的
    amwyyyy
        66
    amwyyyy  
       2018-12-29 11:32:31 +08:00
    blueskea
        67
    blueskea  
       2018-12-29 12:15:39 +08:00 via Android
    用时一时爽,写多了写长了,维护起来是恶梦
    Jex
        68
    Jex  
       2018-12-29 12:17:43 +08:00   ❤️ 1
    @geelaw

    正则表达式匹配 N 的倍数

    https://jex.im/programming/triple-regex.html
    reself
        69
    reself  
       2018-12-29 13:06:55 +08:00 via Android
    @usingnamespace 抱歉确实我说得太笼统了,为了学个正则去学一遍编译原理确实走偏了。就正则而言,只需要学编译原理里的词法那里就行了。再深入下去就是自动机,这个看个人需求了。相对于强记硬背那些鬼画符,从编译原理里选择性的学习是没错的。你觉得呢?
    freedom1988
        70
    freedom1988  
       2018-12-29 13:14:50 +08:00
    把学到的先记录总结,在用到的时候再查看,周而复始就会越来越熟练。可以参考此处 https://www.cnblogs.com/strick/category/907150.html
    veightz
        71
    veightz  
       2018-12-29 13:20:43 +08:00
    收藏一个适合自己的手册和一个实时测试工具
    kaiser1992
        72
    kaiser1992  
       2018-12-29 13:22:05 +08:00
    形式化语言,把 NFA 和 DFA 撸一遍,再理解正则,应该记起来就快了
    kaiser1992
        73
    kaiser1992  
       2018-12-29 13:22:55 +08:00
    @Honwhy 是啊,其实把语法搞明白也就好了
    realkenshinji
        74
    realkenshinji  
       2018-12-29 13:28:18 +08:00 via iPhone
    Copy & Paste from Stackoverflow
    hujianxin
        75
    hujianxin  
       2018-12-29 13:38:46 +08:00
    平时多用 sed、vim,用着用着就忘不掉了
    MarioLuisGarcia
        76
    MarioLuisGarcia  
       2018-12-29 13:43:40 +08:00
    有真实需要的“练习”是最高效的
    arthasgxy
        78
    arthasgxy  
       2018-12-29 14:55:00 +08:00
    多用 vim
    stzz
        79
    stzz  
       2018-12-29 15:31:22 +08:00
    你们楼上的贴的都是啥鬼画符啊
    xavierskip
        80
    xavierskip  
       2018-12-29 16:21:09 +08:00
    用的不多,要用的时候就看看 7 楼的图,然后在线调试工具上试一试呗。
    ourzhang
        81
    ourzhang  
       2018-12-29 16:30:46 +08:00
    平时用的最多的就是在文本编译器里启用正则替换。。会解决一些重复性的工作。
    项目中用的比较少。
    hakono
        82
    hakono  
       2018-12-29 16:41:08 +08:00 via Android
    楼主问正则你们推荐编译原理和自动机什么鬼
    我虽然学过自动机理论也知道这些和正则的关系,但我只想说单纯为了用正则跑去学自动机这些实在是没必要,单纯就是给自己找虐。
    kingwl
        83
    kingwl  
       2018-12-29 17:50:02 +08:00
    不推荐自动机难道推荐常用正则 300 例?
    whitev2
        84
    whitev2  
       2018-12-29 17:58:37 +08:00
    首先收藏这个网站 http://www.regexlab.com/zh/regref.htm
    写的时候边看边写;
    写完了写单例测试过
    inhzus
        85
    inhzus  
       2018-12-29 18:04:35 +08:00
    @ethanlu #7 每次忘了怎么写, 我都搜一下这个图片= =
    hehe520347
        86
    hehe520347  
       2018-12-29 18:31:38 +08:00
    学几次 忘几次
    mPatrickStar
        87
    mPatrickStar  
       2018-12-29 18:46:23 +08:00
    正则表达式比知必会小册子( https://book.douban.com/subject/26285406/) 跟着动手 动手 动手做一遍。如果有什么东西是付出少收益大的那正则算是一个,这玩意不难重点是要用。不仅仅是代码里匹配个邮箱、手机号什么的用,文本搜索替换也要用。
    sdijeenx
        88
    sdijeenx  
       2018-12-29 18:48:07 +08:00
    @Greatshu 写 B 站的屏蔽规则只要会用*就够了(=・ω・=)
    fox0001
        89
    fox0001  
       2018-12-30 14:25:10 +08:00 via Android
    用浏览器开发模式写,很方便
    usingnamespace
        90
    usingnamespace  
       2019-02-10 22:52:19 +08:00 via iPhone
    @reself 你说的肯定是有道理 毕竟自己实践过就会有体会 但是 从编译原理里面选择学的话 编译原理又直接上龙书吗 我只是觉得很多人直接提编译原理从学习知识的方法论上肯定是有问题的
    HelixG
        91
    HelixG  
       2019-05-23 12:35:53 +08:00
    @ethanlu 大佬你的图床挂了,求新图~~~~~
    ethanlu
        92
    ethanlu  
       2019-05-23 12:50:03 +08:00
    @HelixG #91 你说新浪挂了?我看好好的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   953 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 22:57 · PVG 06:57 · LAX 14:57 · JFK 17:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.