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

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

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

编辑:从下面的输入,我添加了以下内容: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 aaa => valid 0-a => valid a&a => not valid a-_0 => not valid a--a => not valid aaa- => not valid 

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

谢谢!

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

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

使用上面的内容,你不会得到连续的字符,例如a-bbb-ccc pass和a--d失败。

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

也将允许非连续的下划线。


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

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

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

 /^(?![-_])[-az\d_]{1,63}(? 

或者,如果Ruby不使用i标志,只需将[-az\d_]替换为[-a-zA-Z\d_]

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

有关字符类 , 量词和外观的更多信息

 /^([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 

中间部分使用环视来validation。

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

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

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

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