V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
flowerfly
V2EX  ›  问与答

请教一个正则表达式匹配问题

  •  
  •   flowerfly · 2014-05-20 21:50:15 +08:00 · 2665 次点击
    这是一个创建于 3838 天前的主题,其中的信息可能已经有所发展或是发生改变。
    正则表达式里有一个\num 字符匹配,它的含义是
    向后引用(back-reference)一个子字符串(substring),该子字符串与正则表达式的第num个用括号围起来的子表达式(subexpression)匹配。其中num是从1开始的正整数,其上限可能是99。
    例如一在个简单的日期匹配的正则表达式——
    SELECT * FROM dual WHERE regexp_like('2014-04-05','^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$');
    中,\2的含义是与第2个子表达式相同的匹配(即是说年与月、月与日之间的连接符要么全为/,要么全为-)。
    现在我在弄一个加强版的日期匹配正则表达式(加入闰年的识别),如下:
    SELECT * FROM dual WHERE regexp_like('2000-02-29',
    '^((19[0-9]{2}|[2-9][0-9]{3})(-|\/)(((0[13578]|1[02])\3(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)\3(0[1-9]|[12][0-9]|30))|(02\3(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))(-|\/)02(\num)29)$');
    问题是,请注意末尾\num,我应该填什么值,使之能匹配上“闰年-02-29或者闰年/02/29”呢?谢谢
    8 条回复
    123123
        1
    123123  
       2014-05-20 22:14:49 +08:00
    这正则看着有点眼晕,LZ 想匹配的应该是正则式中倒数第三个括号中的内容。
    你可以一个一个数看看那是第几个括号。
    flowerfly
        2
    flowerfly  
    OP
       2014-05-20 22:30:19 +08:00
    @123123 终于有人回复了,欣喜。我用替换(的办法,得到是18个括号,但是将18填入,依然匹配不上,哎。事实上,我把num的值用1-100逐一替换,还是匹配不上,也不知道是哪里的问题。
    shw1395
        3
    shw1395  
       2014-05-20 22:30:45 +08:00
    不要用正则,每隔 4 年的所有日期直接列出来写在 sql 语句里。
    flowerfly
        4
    flowerfly  
    OP
       2014-05-20 22:36:27 +08:00
    @shw1395 哥们,你这个太不实用了
    123123
        5
    123123  
       2014-05-20 23:11:32 +08:00   ❤️ 1
    给你数了一遍是第19个……你先用正则工具调试一下比较方便
    superbear
        6
    superbear  
       2014-05-21 09:12:07 +08:00
    看的晕。。
    flowerfly
        7
    flowerfly  
    OP
       2014-05-21 09:21:19 +08:00
    @123123 填入\19了,依旧不行。不知有什么Oracle Regexp的调试工具
    flowerfly
        8
    flowerfly  
    OP
       2014-05-21 20:03:15 +08:00
    终于知道什么问题,Oracle正则表达的向后引用只支持\1到\9,难怪一直不行。十分感谢 @123123
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3286 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 04:52 · PVG 12:52 · LAX 20:52 · JFK 23:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.