正则表达式为"不是字符"不符合预期

时间:2015-12-14 14:32:20

标签: regex

我正在努力满足下一个限制:

  1. 行有3到256个字符,分别是a-z,0-9,破折号或点。
  2. 此行无法以 -
  3. 开头或结尾

    我希望得到下一个输出:

    ^[^-][a-z0-9\-.]{3,256}[^-]$

    有一些正则答案没有给出正确答案: 1)^[^-]+[a-z0-9\-.]{3,256}[^-]+$给所有测试线都不好;

    2)^[^-]?[a-z0-9\-.]{3,256}[^-]?$将前三行视为一个匹配的字符串,因为[^ - ]匹配新行我猜。

    3){{1}}(?对于一个或零匹配的破折号)将所有测试行都视为好

    真相在哪里?我感觉它接近我的或者更复杂。

    P.S。我使用python 3 re模块。

4 个答案:

答案 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}$)[^-].*[^-])$

Regex101 link

答案 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.])$