所以我现在有这个我认为有用,但它很长。我正在使用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)$
然后我将这些正则表达式组合到我顶部的那个...现在按照我的意图工作但是它仍然相当巨大,我想我可以改进。
答案 0 :(得分:3)
首先,我想通知你,你的正则表达式毫无意义。请转到here和here了解更多信息。
对于您的问题,您可以尝试:
J(AN?)?|F(EB?)?|M(AR?)?|...
非捕获组或更好:
J(?:AN?)?|F(?:EB?)?|M(?:AR?)?|...
您不需要在此处使用任何字符类,但您可以使用alternations,群组和question mark quantifiers。
如果要匹配字符串的开头和结尾,可以像这样写
^(?:J(?:AN?)?|F(?:EB?)?|M(?:AR?)?|...)$
要获得更多效果,您可以使用使用atomic groups和possessive 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!