Ruby中有效子域的正则表达式

时间:2011-03-04 16:38:58

标签: ruby-on-rails ruby regex ruby-on-rails-3 subdomain

我正在尝试验证将用作子域的用户输入字符串。规则如下:

  1. 长度在1到63个字符之间(我从谷歌浏览器在子域中显示允许的字符数量中选择63,不确定它是否实际上是服务器指令。如果您对有效最大长度有更好的建议,我就是有兴趣听听它)
  2. 可能包含a-zA-Z0-9,连字符,下划线
  3. 不得以连字符或下划线开头或结尾
  4. 编辑:从下面的输入中,我添加了以下内容: 4.不应包含连续的连字符或下划线。

    示例:

    a => valid
    0 => valid
    - => not valid
    _ => not valid
    a- => not valid
    -a => not valid
    a_ => not valid
    _a => not valid
    aa => valid
    aaa => valid
    a-a-a => valid
    0-a => valid
    a&a => not valid
    a-_0 => not valid
    a--a => not valid
    aaa- => not valid
    

    我的问题是我不确定如何使用RegEx指定字符串只允许一个字符,同时还指定它不能以连字符或下划线开头或结尾。

    谢谢!

5 个答案:

答案 0 :(得分:17)

不能可以在正确的子域中有下划线,但你需要它们吗?在trim输入后,执行简单的字符串长度检查,然后使用以下方法进行测试:

/^[a-z\d]+(-[a-z\d]+)*$/i

使用上述内容,您不会获得连续的-个字符,例如a-bbb-ccc次传递a--d失败。

/^[a-z\d]+([-_][a-z\d]+)*$/i

也允许非连续的下划线。


更新:您会发现,在实践中,不允许使用下划线,并且所有子域名都必须以字母开头。上述解决方案不允许国际化子域(punycode)。你最好使用这个

/\A([a-z][a-z\d]*(-[a-z\d]+)*|xn--[\-a-z\d]+)\z/i

答案 1 :(得分:0)

/^([a-z0-9][a-z0-9\-\_]{0,61}[a-z0-9]|[a-z0-9])$/i

我认为创建一个正则表达式是一个挑战,它只能匹配非重复连字符或下划线的字符串,并且还要检查适当的长度:

/^([a-z0-9]([_\-](?![_\-])|[a-z0-9]){0,61}[a-z0-9]|[a-z0-9])$/i

中间部分使用环视来验证。

答案 2 :(得分:0)

我不熟悉Ruby正则表达式语法,但我会假设它就像是Perl。听起来像你想要的:

/^(?![-_])[-a-z\d_]{1,63}(?<![-_])$/i

如果Ruby不使用i标记,只需将[-a-z\d_]替换为[-a-zA-Z\d_]

我使用[-a-zA-Z\d_]代替较短[-\w]的原因是,虽然几乎相同,但\w会允许特殊字符,例如ä而不仅仅是ASCII型字符。在大多数语言中可以选择关闭该行为,或者如果您愿意,可以允许它。

有关character classesquantifierslookarounds

的更多信息

答案 3 :(得分:0)

^ [A-ZA-Z]([ - α-ZA-Z \ d] * [A-ZA-Z \ d])$

这样就可以在没有回溯的情况下以有效的方式强制执行标准。它没有检查长度,但Regex在这样的事情上效率低下。只需检查字符串长度(1到64个字符)。

答案 4 :(得分:-1)

/[^\W\_](.+?)[^\W\_]$/i应该适用于你(尝试我们的http://rubular.com/来测试正则表达式)

编辑:实际上,这不会检查单/双字母/数字。请尝试/([^\W\_](.+?)[^\W\_])|([a-z0-9]{1,2})/i,然后在rubular中修改它,直到你得到你想要的东西(如果这还没有处理它)。