我正在尝试验证将用作子域的用户输入字符串。规则如下:
编辑:从下面的输入中,我添加了以下内容: 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指定字符串只允许一个字符,同时还指定它不能以连字符或下划线开头或结尾。
谢谢!
答案 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型字符。在大多数语言中可以选择关闭该行为,或者如果您愿意,可以允许它。
答案 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中修改它,直到你得到你想要的东西(如果这还没有处理它)。