1

所以我目前有这个我相信它有效但它很长。我正在使用 C# 正则表达式。

^(:?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)$

有什么办法可以缩短这个时间吗?我认为这已经很简单了,但是如果有一种方法可以将我在这里的内容组合成一个更短的正则表达式,这就是我所追求的。

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

仅限首字母。^(:?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)$

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

4

1 回答 1

3

首先,我想告诉你,你的正则表达式没有意义。请到这里这里获取更多信息。

对于你的问题,你可以试试这个:

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

或更好的非捕获组:

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

您不需要在这里使用任何字符类,但您可以使用交替、组和问号量词

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

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

要获得更多性能,您可以使用这种使用原子组所有格量词的模式:

^(?>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!
于 2013-06-13T22:39:43.740 回答