试图创建一个允许以下格式yyyy [: - ] [VW]周数的正则表达式

时间:2016-09-07 10:35:31

标签: regex

我的正则表达式目前看起来像这样

\b(19|20)\d{2}\b[- :][VW][0-5]{1}(?(?=[5])[0-2]{1}|[0-9]{1})

当我试图获得这部分时,它并不是我想做的事情

(?(?=[5])[0-2]{1}|[0-9]{1})

说“如果以前的数字是5,那么你只能在0-2之间选择,如果它是0-4的另一个数字,则允许在0-9之间选择

目前它允许00-59排除05,15,25,35等。

基本上我希望它看起来像2016-W25。

1 个答案:

答案 0 :(得分:2)

您需要将[5]替换为肯定的后备(?<=5),以检查当前位置的左侧的

\b(19|20)\d{2}[- :][VW][0-5](?(?=(?<=5))[0-2]|[0-9])
                                  ^^^^^

请参阅regex demo

此外,您可以使用仅仅交替组来消除条件模式:

\b(19|20)\d{2}[- :][VW](?:[0-4][0-9]|5[0-2])
                       ^^^^^^^^^^^^^^^^^^^^^

请参阅this regex demo

(?:[0-4][0-9]|5[0-2])匹配04之间的数字,然后匹配任何数字(请参阅[0-4][0-9]),或(请参阅|)a {{ 1}}后跟501(请参阅2)。

注意:由于周数可以达到53,因此最后的5[0-2]可能会替换为[0-2],以匹配[0-3]值。