仅用于字母、数字、破折号的正则表达式?

问题描述 投票:0回答:4

我正在尝试在 Ruby 中验证二级域名(.com 之前和 https:// 之后的所有内容),以便我可以将其传递到我的 namecheap api 请求中。这是我到目前为止所拥有的,但我不熟悉正则表达式

validates_format_of :sld, with: [a-zA-Z0-9-]
  • 不允许有空格
  • 不允许使用特殊字符
  • 但是,破折号是允许的
  • 不能以破折号开头
  • 不能以破折号结尾

我知道大写字符在域名中不起作用,但我不想让用户再次输入文本。我将小写用户输入并在下一页上显示一条闪存消息。

ruby-on-rails ruby regex validation
4个回答
4
投票

怎么样

validates_format_of :sld, with: /\A[a-z\d][a-z\d-]*[a-z\d]\z/i

说明:

  • \A
    - 匹配字符串的开头
  • [a-z\d]
    - 匹配 a-z 中的任何字母或 0-9 中的数字一次
  • [a-z\d-]
    - 匹配 a-z 中的任何字母、0-9 中的数字或破折号 零次或多次
  • [a-z\d]
    - 匹配 a-z 中的任何字母或 0-9 中的数字一次
  • \z
    - 匹配字符串结尾
  • i
    标志 - 使匹配不区分大小写

注意:这仅适用于长度为 2 或以上的字符串。 如果需要支持单字符输入, 我只想编写一个方法来检查字符串长度,如果它是单个字符,请确保它不是破折号。 如果超过 2 个字符,请使用此正则表达式进行验证。


2
投票

这可能会起作用:

^[0-9A-Za-z](|[-0-9A-Za-z]{0,61}[0-9A-Za-z])$
  • 您的字符串需要以字母数字开头 (
    [0-9A-Za-z]
    )
  • 那么,有两个选择(

    (|[-0-9A-Za-z]{0,61}[0-9A-Za-z])
    ):

    • 字符串结尾
    • 介于 0 和 61 之间的字母数字或破折号字符,后跟字母数字字符。 (最多 63 个字符)
  • ^
    $
    是锚点


0
投票
validates :sld, format: { with: /^(?!-)[-\w\d]{,63}(?<!-)$/i }

您可以在 http://rubular.com/

尝试您的正则表达式
  • ^(?!-)
    - 负向前瞻:不能以破折号开始
  • [-\w\d]
    - 匹配单词
    \w
    、数字
    \d
    或破折号
    -
  • {,63}
    - 匹配项必须介于 1 到 63 个字符之间
  • (?<!-)$
    - 负向回顾:不能以破折号结束
  • /i
    - 不区分大小写

0
投票

域名只能包含字母 A-Z、数字 0-9 和连字符 (-),以及用于对域进行层次结构分组的一个标点符号 (.),例如在下面 。否或 .com。

© www.soinside.com 2019 - 2024. All rights reserved.