限制字符重复到多个固定长度(而不是范围)

问题描述 投票:0回答:4
我可以做到这一点,但我不喜欢我重复角色群:

-(?:[A-Za-z0-9]{8}|[A-Za-z0-9]{12})$

当我需要支持的时间更多时,它会变得不守规矩:

-(?:[A-Za-z0-9]{8}|[A-Za-z0-9]{12}|[A-Za-z0-9]{16}|[A-Za-z0-9]{20}|[A-Za-z0-9]{24}|[A-Za-z0-9]{28}|[A-Za-z0-9]{32})$

还有其他其他简洁的方法来做到这一点,还是我能做的最好的方法?
我会接受任何适合我的案件的东西,但是如果有可以适用于任何任意长度的选择,那就太好了。
    

一般而言,您可以避免通过将整个重复编号包含在量词

{8,12}
中,但不包括the的无效范围,以这样的负面lookahead模式来避免多次拼写相同的字符。
{9,11}

显然,如果您有多个有效的重复号码,则必须使用多个负面lookahead模式排除多个无效的范围,但是至少您仍然可以避免反复拼写相同的字符集。
@@haowu建议使用子例程的建议,如果您的正则发动机支持它,则是最好的选择。
    

-(?!.{9,11}$)[A-Za-z0-9]{8,12}$

regex
4个回答
1
投票

-(?:[A-Za-z0-9]{4}){2,8}$

,因为您在最后一个示例中显示了必须支持4、8至32的某些倍数。我使用Notepad ++检查结果,因此表达式中的其他更改。
显然,它只有在您所解释的情况下才起作用,所有4的倍数在8到32的范围内。
    
看起来您已经有正确的正则言论;可能会简短:

-(?=(?:.{8}|.{12}|.{14})$)[A-Za-z0-9]+$

什么都没想到。 thislink.

我的想法与

0
投票
的想法相似,因为我建议您在前检查长度。但是,我建议对可能长度的积极定义。仅供插图,我使用长度为8,12,14,不仅具有4.

的倍数。 我的正则尝试是:

-

regex101

0
投票
解释:

-

:字面上的锚模式

(?=(?: ... )$)

-

:向前看并检查线之间的字符串长度的不同配置。

0
投票

.{8}|.{12}|.{14}:在这种情况下8,12,14。

[A-Za-z0-9]+$
:终于主张您的字符串组成直到线结束。

我不愿添加其他答案的原因是,在像Python这样的编程语言中,您现在可以根据可能的长度列表来生成模式: import re strings=[ "some file name-ASDFghjk", "some file name-ASDFghjk12", "some file name-ASDFghjk1234", "some file name-ASDFghjk123456", "some file name-ASDFghjk12345678" ] allowed_len=[8,12,14] # concatinate the possible lenght to ".{a}|.{b}|....." joined_len="|".join(".{"+str(n)+"}" for n in allowed_len) # use the concatination in the regex pattern to "outsource" the thought # the ramaining pattern can easily be maintained here now. pat=re.compile(rf"-(?=(?:{joined_len})$)[A-Za-z0-9]+$") # validate output [re.search(pat,s) for s in strings]

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.