【问题标题】:Regex with letter number and dash without leading and trailing dash带有字母数字和破折号的正则表达式,没有前导和尾随破折号
【发布时间】:2021-04-12 21:19:45
【问题描述】:

对不起,如果我的问题很简单,但是我被阻止了。

我正在寻找一种方法来验证匹配多个案例的正则表达式:

  • 最少 1 个字符(可以是字母或数字)
  • 最多 100 个字符(可以是字母、数字和破折号)
  • 不能以破折号开头
  • 不能以破折号结尾
  • 后面不能有 2 个破折号

我试过这个:^[a-zA-Z0-9]{1}(?:([a-zA-Z0-9][-]{0,1}){0,98}[a-zA-Z0-9])?$

它几乎适用于所有情况。除了这两种情况:

  • 0-1234(第二个字符上的破折号)
  • 如果我写了 100 个字符 (0123456789[...]blablabla),然后我在里面插入破折号,即使我不想超过 100 个字符,它仍然会验证字符串

有人可以帮帮我吗?非常感谢!

【问题讨论】:

  • 请始终添加您的编程语言/工具,因为正则表达式引擎有些不同。
  • 对不起,我忘了。我正在使用 Python 进行开发,并且正在使用“re”模块

标签: python regex


【解决方案1】:

您正在寻找前瞻和另一个字符类:

^(?!-)(?!.*-$)(?!.*--)[a-zA-Z0-9-]{1,100}$

a demo on regex101.com

【讨论】:

  • 非常感谢,看来可以了。我仍然需要解密它是如何工作的,但它确实如此!
【解决方案2】:

这只是 Jan 已经完美解决方案的替代方案。

^(?:[^\W_]|(?<=[^\W_])-(?=[^\W_])){1,100}$

它可以被“解密”为:在 1 到 100 次之间

  • 一个字母或数字,或
  • 一个破折号前后是一个字母或数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-07
    • 1970-01-01
    • 2017-04-30
    相关资源
    最近更新 更多