先说问题
问题的关键就是{n,m}
这种写法是贪婪的, 就是会尽量往m
上靠
举例
比如我们想用正则匹配下面几个, 把年月日给挑出来
2020-01-02
2020-1-2
2020.01.02
2020 01 02
2020 1 2
2020/01/02
20200102
有没有发现, 如果除了最后一个, 我们都可以用非常简单的方法来做:
(\d+)[-. /](\d+)[-. /](\d+)
是不是很简单, 但是最后给我们来了一个20200102
, tnnd, 中间一个分隔符都没有, 然后我心想这该怎么搞?, 还是先把中间的中括号
匹配的特殊字符先加上
一个?
把, 匹配0个或者1个, 但是这样一来, 第一个\d+
就能直接匹配到最后了
(\d+)[-. /]?(\d+)[-. /]?(\d+)
好, 我们继续该, 第一组数字匹配改成\d{4}
(\d{4})[-. /]?(\d+)[-. /]?(\d+)
这样也不行呀, 从第二组数字开始就能把20200102
给直接匹配到最后了, 然后就有了这种写法
(\d{4})[-. /]?(\d{1, 2})[-. /]?(\d+)
为什么给第二组数字写上{1, 2}
就能匹配到20200102
呢?
结果有没有可能是2020, 0, 102
而不是2020, 01, 02
呢, 不会的, 结果肯定是第二种
就是因为{n, m}
这种写法是贪婪的, 我们写{1, 2}
他会金量往两个去匹配.