一直以来,我都认为能手写正则表达式的人都是大神,至少不会是坑。正则表达式这个知识领域,在各种语言中被大神们运用的淋漓尽致。作为一个菜鸡程序员,向大神看齐的最简单的方式就是写一手简单粗暴的正则表达式。
正则表达式是干什么的呢?
举个最简单的例子,今天下午的时候测试人员给我提了一个bug,并且打上了严重的标签。其实看到这个bug的一瞬间,我就意识到是ios对Date方法的一下兼容性问题。至于在哪里出现的,对于我这个刚接触到移动端的人来说很迷茫。
查了一下资料发现ios对new Date("2017-08-11 12:00:00")这个方法貌似不是很感冒,ios中不支持 “-” 连接日期。因此,由于后台传来的数据有两种,第一张是毫秒级别的时间戳,另一种就是“-”分割的日期。那么问题来了,如何区别这两种数据格式呢,其实我在看后端传来的数据时,有的毫秒数是传来的字符串的形式,因此单单地靠区分字符串还是数字是无法判断的。除了通过判断indexOf('-')是否大于-1之外,根据本文主题,我们还可以使用正则来判断:/-/.test('2018-01-01')。其中/-/就是一个用于匹配“-”的正则表达式,test()是正则表达式用于计算的方法。
言归正传,当区分完成毫秒数还是带“-”的字符串之后,纵使我们可以使用简单的字符串转数组然后再转字符串的方式解决,但是太繁琐太笨重。此时,能写一手简单粗暴的正则表达式就变得尤为的重要。首先,我们要匹配出所有的“-”,然后将其替换成“/”。因此,我们要使用replace()这个方法。str.replace(/-/g, "/"),由于要匹配所有的“-”,我们使用了g这个全局修饰符,g等同于global,全局的意思。
于是乎,一个看似棘手的问题,我们可以通过两个正则表达式和四行代码解决:
if (/-/.test(time)) { let date = new Date(time.replace(/-/g, "/")); } else { let date = new Date(time); }
正则表达式或许枯燥无味,但是一旦开启,将会是一个威力巨大的武器.
看我神威,无坚不摧。