我正在努力满足下一个限制:
我希望得到下一个输出:
^[^-][a-z0-9\-.]{3,256}[^-]$
有一些正则答案没有给出正确答案:
1)^[^-]+[a-z0-9\-.]{3,256}[^-]+$
给所有测试线都不好;
2)^[^-]?[a-z0-9\-.]{3,256}[^-]?$
将前三行视为一个匹配的字符串,因为[^ - ]匹配新行我猜。
3){{1}}(?对于一个或零匹配的破折号)将所有测试行都视为好
真相在哪里?我感觉它接近我的或者更复杂。
P.S。我使用python 3 re模块。
答案 0 :(得分:5)
这个几乎是正确的:^[^-][a-z0-9\-.]{3,256}[^-]$
开头和结尾的[^-]
代表一个字符,因此您需要将{3,256}
更改为{1,254}
另外,你可能只想要a-z,0-9和。在开始和结束时(不只是任何除了 - ),因此完整的正则表达式变为:
^[a-z0-9.][a-z0-9\-.]{1,254}[a-z0-9.]$
答案 1 :(得分:2)
使用预测确认该行符合您的基本要求((?=^[0-9a-z.-]{3,256}$)
),然后应用进一步的限制。:
^((?=^[0-9a-z.-]{3,256}$)[^-].*[^-])$
答案 2 :(得分:1)
您可以使用:
^(?!-)[a-z0-9.-]{3,256}(?<!-)$
(?!-)
是一个负前瞻断言(后面没有短划线),而(?<!-)
是一个负面的后视(不是前面的短划线)。
答案 3 :(得分:0)
你不想要{3,256}
...你想要{1,254}
,因为[^-]
每个也在你的字符串的开头和结尾都匹配1个字符,所以你必须减去它们来自你想要的总字符数。
^[a-z0-9.][a-z0-9.-]{1,254}[^a-z0-9.]$
或者,如果你想保留你的价值,你也可以使用lookahead / behinds:
^(?=[a-z0-9.])[a-z0-9.-]{3,256}(?<=[a-z0-9.])$