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

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

  •  
  •   szzhiyang · 114 天前 · 5477 次点击
    这是一个创建于 114 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    90 回复  |  直到 2019-02-10 22:52:19 +08:00
        1
    ethanlu   114 天前   ♥ 1
    正则这东西会就行了,没事不会天天写,反正学会之后就写了两个,遇到要用的时候找个正则网站试几个样本,ok 啦。
        2
    likuku   114 天前   ♥ 2
    尽量不用它,实在逃不掉的话,那就在线搜,反正各种在线 正则生成器 /测试器 足够多。

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

    没错,我就是不会正则的人
        3
    alexmy   114 天前
    学了几次,又都忘了,最近打算写一个 golang 的工具库,包括正则的,顺带当练习下。
        4
    szzhiyang   114 天前
    @likuku @ethanlu

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

    后来接触 scrapy,意外写了几个,会了,
    其他的就套用了
        7
    ethanlu   114 天前   ♥ 10
    @szzhiyang #4 拿走不谢
        8
    clino   114 天前
    kodos re ide
        9
    lhx2008   114 天前
    我每次写都要看那个手册,啥正向肯定预查、正向否定预查、反向肯定预查、反向否定预查你们真的记得住吗?
        10
    szzhiyang   114 天前
    @ethanlu

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

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

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

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

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

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

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

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

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

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

    之后碰到问题现查解决方法,用的多了自然就记住了
        51
    DavidNineRoc   114 天前
    当初去爬妹子图片的时候现学的,现在还忘不了。你可以试试。
        52
    CallMeReznov   114 天前
    https://regexone.com/
    https://regexcrossword.com/

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

    就比如 @bumz 出的这个题目
        56
    Honwhy   114 天前
    我读过精通正则表达式这本书,快忘得差不多了
    正则表达式有方言区别,有语言实现上的差异
        57
    kingwl   114 天前
    @Honwhy 指望背....是肯定记不住的.....
        58
    asj   114 天前
    用 vi
        59
    glouhao   114 天前 via Android
    我在火车头上练
        60
    abc635073826   114 天前
    🔍
        61
    wobuhuicode   114 天前
    没把规则记清楚,写太多也没用
        62
    zhaogaz   114 天前
    额,先理解正则的设计模型。

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

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



    匹配 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 字符的表达式。
        64
    afirefish   114 天前
        65
    amwyyyy   114 天前
    分享下公司同事的分享,里面有些练习题挺不错的
        67
    blueskea   114 天前 via Android
    用时一时爽,写多了写长了,维护起来是恶梦
        68
    Jex   114 天前   ♥ 1
    @geelaw

    正则表达式匹配 N 的倍数

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