前几天写代码,遇到一个需求:
- 解析
sleep NUMBER
这样的命令 - 能够识别缺参数或者参数错误的情况
这个正则并不复杂,初步写出来大概是这样:sleep\s+(.*)
。这样,$1 就是参数,然后就可以检验。但是 .*
匹配“任意字符出现零次或多次”,所以实际测试发现它根本不匹配任何参数。
然后我就改成了 sleep(?:\s+(.*))?
,然后在下一步 trim。这样,sleep
后面整个都是可选参数,就能解决上面的问题。
然后就被老板骂了……老板的答案是 sleep\s+(.*?)\s*$
。重点在于后面的 $
,要求正则必须匹配行尾,这样一来,懒惰模式的 .*?
就需要一直匹配到行尾,并且尽量少匹配内容,所以诸如 a b
之类的情况也可以正常跑匹配了。
从这里,我学到:
$
和\b
虽然并不能匹配到一个确定的字符,但它们同样意义重大- 不特定长度匹配,包括
*
,+
,甚至{n, m}
,在懒惰模式下,后面都要尽量跟上明确的结束条件,以便让前面尽快结束。
欢迎吐槽,共同进步