2020-05-16 5 kyu validDate Regex

2020-05-17  本文已影响0人  苦庭

https://www.codewars.com/kata/548db0bd1df5bbf29b0000b7

My answer / AC

var validDate = /(?<=\[)((0[13578]\-(0[1-9]|[1-2][0-9]|3[01]))|(1[02]\-(0[1-9]|[1-2][0-9]|3[01]))|(0[469]\-(0[1-9]|[1-2][0-9]|30))|(11\-(0[1-9]|[1-2][0-9]|30))|(02\-(0[1-9]|1[0-9]|2[0-8])))(?=\])/;

哪里不好?

Best answer

var days28 = /02-(0[1-9]|1\d|2[0-8])/
var days30 = /(?:0[469]|11)-(?:0[1-9]|[12]\d|30)/
var days31 = /(?:0[13578]|10|12)-(?:0[1-9]|[12]\d|3[01])/

var validDate = new RegExp(
  '\\[(' +
    '(?:' + days28.source + ')|' +
    '(?:' + days30.source + ')|' +
    '(?:' + days31.source + ')' +
  ')\\]'
)

好在哪里?

Best answer2

const validDate = /\[(?!(0[2469]|11)-31)(?!02-(29|30))(0[1-9]|1[0-2])-(?!00)([0-2]\d|3[01])\]/;

这个是另外一个我觉得很聪明的写法,能够将非捕捉分组的“AND”特性运用起来。

因此在这个回答中,非捕获分组(?!(0[2469]|11)-31)(?!02-(29|30))不能满足的话才能继续接着匹配,从而达到判断排除不符合天数的月份的目的。

上一篇下一篇

猜你喜欢

热点阅读