谁能解释为什么这个正则表达式失败了?

时间:2013-01-17 15:23:24

标签: regex

正则表达式

[a-z0-9]{1,10}_([0]?[1-9]|[1][0-2])([0]?[1-9]|[1|2][0-9]|[3][0|1])([2000-2099]{4}).cta$

此字符串失败

abscriprod_01152013.cta

此字符串有效

abscriprod_11152012.cta

似乎任何以3-8结尾的年份都会失败,但我看不出原因。

P.S。我在RegEx吮吸,所以如果这里有一个明显的错误,不要笑: - )

2 个答案:

答案 0 :(得分:4)

您需要阅读一些正则表达式手册,例如perlretut。您使用的正则表达式包含多个缺陷:

  1. /[0]/中只包含一个字符的字符类最好简写为/0/
  2. /./将匹配任何字符(换行符除外)。要匹配文字点,您必须将其转义:/\./
  3. 与“1”或“2”匹配的字符类可能不会写入/[1|2]/,而是/[12]/而不会将管道放在中间。如果您将管道放在那里,它将匹配3个字符'1','2'或'|'中的一个。
  4. 要匹配2000到2099范围内的数字,您可能不会使用/[2000-2099]/,因为这样的字符类将匹配其中一个字符'0','1'(因为0-2),' 2'或'9'。相反,您可以使用/20\d\d/
  5. H2H

答案 1 :(得分:1)

因为这一点而失败:

[2000-2099]{4}

真正说的是:

200

中的一个字符2或0

0-2

中0到2范围内的字符

然后来自099

的其中一个字符0或9

为了匹配,因为我怀疑你想要从2000年到2099年使用4位数:

20\d\d
相关问题