-(?:[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}$
-(?:[A-Za-z0-9]{4}){2,8}$
,因为您在最后一个示例中显示了必须支持4、8至32的某些倍数。我使用Notepad ++检查结果,因此表达式中的其他更改。 显然,它只有在您所解释的情况下才起作用,所有4的倍数在8到32的范围内。看起来您已经有正确的正则言论;可能会简短:
-(?=(?:.{8}|.{12}|.{14})$)[A-Za-z0-9]+$
什么都没想到。 thislink.
。我的想法与
的倍数。 我的正则尝试是:
-
在
regex101.{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]