无法根据数字范围限制正则表达式

时间:2019-01-09 03:51:18

标签: javascript regex

我在设置正则表达式以匹配特定格式方面遇到了问题。这是所需的格式:

星期一(一周中的任何一天) 1-7 (月-日) 1:00 (时间(12小时格式)) (允许多次出现,但必须匹配此模式)地狱/缓存/幻影(允许多次出现)

到目前为止,我已经完成了大部分工作,但是我查找了几个SO和其他网站,这些网站告诉我如何对数字范围进行正则表达式。我遇到的问题是时间。我有一个允许1:00的正则表达式,但是我不知道如何也只允许1或2这样的数字,而最后不允许:00。因此,我想对此有所了解,因此我决定暂时简化一下,只做数字1-12。

这是我当前的模式:

const scrimFormatPattern = /(((mon|fri|sun)(day)?|tue(sday)?|wed(nesday)?|thu(rsday)?|sat(urday)?)+ ((0?[1-9]|1[0-2])-(0?[1-9]|1[0-9]|2[0-9]|3[0-1]))+ ([1-9]|1[012])+ .*((inferno)|(nuke)|(mirage)|(dust2)|(train)|(overpass)|(cache)|\/))/gims

除了时间之外,其他所有功能都可以使用。即使是这个简单的(花费时间仅为([1-9]|1[012])),当我输入13时,它也不会失败。

编辑是的,我知道日期部分有一个数字范围,我尝试采用这种逻辑并将其与时间配合使用,但仍然无法使用。

编辑2 ,这是我用来检查匹配项的代码,它是不和谐的漫游器,因此msg.content只是用户在不和谐中键入的字符串。

let result = msg.content.match(scrimFormatPattern)

编辑3 此处是没有使此模式wed 1-9 13 inferno

失败的输入示例

编辑4 我认为我处在一个不错的位置,但似乎无法使用正则表达式来提取多个条目,这是最新的模式:

const scrimFormatPattern = /(((mon|fri|sun)(day)?|tue(sday)?|wed(nesday)?|thu(rsday)?|sat(urday)?)+ ((0?[1-9]|1[0-2])-(0?[1-9]|1[0-9]|2[0-9]|3[0-1]))+ ((1[012])(:|| )(00|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9])? ?[aApP]m|(1[012])(:|| )(00|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9])?)+ ((inferno)|(nuke)|(mirage)|(dust2)|(train)|(overpass)|(cache)|\/))/gims

如果您这样做

wed 1-9 13:00 inferno

它将会失败(应该如此)

但如果您这样做

wed 1-9 12 13:00 inferno

它将通过(不应该通过)

1 个答案:

答案 0 :(得分:0)

我认为您的正则表达式过于复杂,请尝试以下操作:

((mon|fri|sun)(day)?|tue(sday)?|wed(nesday)?|thu(rsday)?|sat(urday)?) (0?[1-9]|1[0-2])-([0-2]?[1-9]|3[0-1]) (0?[1-9]|1[012])([: ][0-5]?[0-9])? ?[aApP]m (inferno|nuke|mirage|dust2|train|overpass|cache|\/)

找到一个演示here

周围散布着太多的加号,而且您在中间不必要地重复了一些模式。

使用正则表达式时,您需要非常谨慎地捕获不需要的东西,请确保认真考虑边缘情况,尤其是所需的负面情况。

编辑

这可以解决多个时间部分的需求吗?

((mon|fri|sun)(day)?|tue(sday)?|wed(nesday)?|thu(rsday)?|sat(urday)?) (0?[1-9]|1[0-2])-([0-2]?[1-9]|3[0-1]) ((0?[1-9]|1[012])([: ][0-5]?[0-9])? ?[aApP]m )+(inferno|nuke|mirage|dust2|train|overpass|cache|\/)

演示here

编辑2 (修复10天和20天)

((mon|fri|sun)(day)?|tue(sday)?|wed(nesday)?|thu(rsday)?|sat(urday)?) (0?[1-9]|1[0-2])-(0?[1-9]|[12][0-9]|3[0-1]) ((0?[1-9]|1[012])([: ][0-5]?[0-9])? ?[aApP]m )+(inferno|nuke|mirage|dust2|train|overpass|cache|\/)

演示here