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

2014-05-20 21:50:15 +08:00
 flowerfly
正则表达式里有一个\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”呢?谢谢
2666 次点击
所在节点    问与答
8 条回复
123123
2014-05-20 22:14:49 +08:00
这正则看着有点眼晕,LZ 想匹配的应该是正则式中倒数第三个括号中的内容。
你可以一个一个数看看那是第几个括号。
flowerfly
2014-05-20 22:30:19 +08:00
@123123 终于有人回复了,欣喜。我用替换(的办法,得到是18个括号,但是将18填入,依然匹配不上,哎。事实上,我把num的值用1-100逐一替换,还是匹配不上,也不知道是哪里的问题。
shw1395
2014-05-20 22:30:45 +08:00
不要用正则,每隔 4 年的所有日期直接列出来写在 sql 语句里。
flowerfly
2014-05-20 22:36:27 +08:00
@shw1395 哥们,你这个太不实用了
123123
2014-05-20 23:11:32 +08:00
给你数了一遍是第19个……你先用正则工具调试一下比较方便
superbear
2014-05-21 09:12:07 +08:00
看的晕。。
flowerfly
2014-05-21 09:21:19 +08:00
@123123 填入\19了,依旧不行。不知有什么Oracle Regexp的调试工具
flowerfly
2014-05-21 20:03:15 +08:00
终于知道什么问题,Oracle正则表达的向后引用只支持\1到\9,难怪一直不行。十分感谢 @123123

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/113484

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX