使用正则表达式验证3个字母的月份缩写输入

时间:2013-06-13 22:25:51

标签: c# regex validation abbreviation

所以我现在有这个我认为有用,但它很长。我正在使用C#regex。

^(:? J),$ | ^(:? J),$ | ^(:?F)$ | ^(:? M)$ | ^(?: A)$ | ^(?: A)$ | ^(?: S)$ | ^(?: O)$ | ^(?: N)$ | ^(?: d)$ | ^(:? JA)$ | ^(:? JU)$ | ^ (?:FE)$ | ^(:? MA)$ | ^(?: AP)$ | ^(?:AU)$ | ^(?: SE)$ | ^(?: OC)$ | ^(? :NO)$ | ^(?:DE)$ | ^(:? JAN)$ | ^(:? FEB)$ | ^(:? MAR)$ | ^(:? APR)$ | ^(?:MAY )$ | ^(?: JUN)$ | ^(?:年7月)$ | ^(?:AUG)$ | ^(?:SEP)$ | ^(?:OCT)$ | ^(?: NOV)$ | ^(?: DEC)$

有什么方法可以缩短它吗?我认为这已经非常简单,但如果有办法将我在这里的东西组合成一个更短的正则表达式,那就是我所追求的。

我需要它来匹配第一个字母,第一个和第二个字母以及月份缩写的所有三个字母的组合。

仅限第一封信。 ^(:?J),$ | ^(:? J),$ | ^(:?F)$ | ^(:? M)$ | ^(?: A)$ | ^(?: A)$ | ^( ?:S)$ | ^(?: O)$ | ^(?: N)$ | ^(?: d)$

第一个和第二个字母组合与此匹配。 ^(:? JA)$ | ^(:? JU)$ | ^(:? FE)$ | ^(:? MA)$ | ^(?: AP)$ | ^(?:AU)$ | ^( ?:SE)$ | ^(?: OC)$ | ^(?: NO)$ | ^(?: DE)$

完整缩写: | ^(:? JAN)$ | ^(:? FEB)$ | ^(:? MAR)$ | ^(:? APR)$ | ^(?:MAY)$ | ^(?: JUN)$ | ^ (?:JUL)$ | ^(?: AUG)$ | ^(?: SEP)$ | ^(?: OCT)$ | ^(?: NOV)$ | ^(?: DEC)$

然后我将这些正则表达式组合到我顶部的那个...现在按照我的意图工作但是它仍然相当巨大,我想我可以改进。

1 个答案:

答案 0 :(得分:3)

首先,我想通知你,你的正则表达式毫无意义。请转到herehere了解更多信息。

对于您的问题,您可以尝试:

J(AN?)?|F(EB?)?|M(AR?)?|...
非捕获组

或更好:

J(?:AN?)?|F(?:EB?)?|M(?:AR?)?|...

您不需要在此处使用任何字符类,但您可以使用alternations,群组和question mark quantifiers

如果要匹配字符串的开头和结尾,可以像这样写

^(?:J(?:AN?)?|F(?:EB?)?|M(?:AR?)?|...)$

要获得更多效果,您可以使用使用atomic groupspossessive quantifiers

的此模式
^(?>J(?>AN?+)?|F(?>EB?+)?|M(?>AR?+)?|...|D(?>EC?+)?)$

您可以使用这样的月份名称来快速失败:

^(?>J(?>AN|U[NL]?+)?|F(?>EV?+)?|M(?>A[RI]?+)?|A(?>PR?+|UG?+)?|S(?>EP?+)?|O(?>CT?+)?|N(?>OV?+)?|D(?>EC?+)?)$

正则表达式引擎有什么作用?最后一个模式的示例:

我的示例字符串是AU(对于AUGUSTUS)

 ^(?>             # an atomic group is at the begining of the pattern
                  # In this group there is an alternation J...|F...|M... 
                  # until the closing parenthesis of the atomic groups
 )$               # at the end of the string

正则表达式引擎尝试了什么:

^   ^   # the re is on the begining of the string, all is fine
A   J   # the re try with J and fails then goes to the next alternation
A   F   # test F and fails ...
A   M   # ...
A   A   # test A and succeeds
U   P   # test P and fails and goes to the next alternation
U   U   # test U and succeeds
$   G   # don't test anything the re know that it is the end of the string!