我正在尝试制作一个regexp来验证iSCSI限定名称。限定名称的示例是iqn.2011-08.com.example:storage
这是最小的示例,我已经看到了更多扩展的其他示例。
到目前为止,我必须对此进行验证:
print "Enter a new target name: ";
my $target_name = <STDIN>;
chomp $target_name;
if ($target_name =~ /^iqn\.\d{4}-\d{2}/xmi) {
print GREEN . "Target name is valid!" . RESET . "\n";
} else {
print RED . "Target name is not valid!" . RESET . "\n";
}
我怎样才能将其扩展到:
休息,:
之后我不会解析它是一个描述标记。
域名的大小是否有限制?
答案 0 :(得分:5)
根据RFC3270(以及RFC1035),
/
(?(DEFINE)
(?<IQN_PAT>
iqn
\.
[0-9]{4}-[0-9]{2}
\.
(?&REV_SUBDOMAIN_PAT)
(?: : .* )?
)
(?<EUI_PAT>
eui
\.
[0-9A-Fa-f]{16}
)
(?<REV_SUBDOMAIN_PAT>
(?&LABEL_PAT) (?: \. (?&LABEL_PAT) )*
)
(?<LABEL_PAT>
[A-Za-z] (?: [A-Za-z0-9\-]* [A-Za-z0-9] )?
)
)
^ (?: (?&IQN_PAT) | (?&EUI_PAT) ) \z
/sx
目前尚不清楚eui名称是否接受小写十六进制数字。我认为让它们更安全。
如果您压缩上述内容,则会获得/^(?:iqn\.[0-9]{4}-[0-9]{2}(?:\.[A-Za-z](?:[A-Za-z0-9\-]*[A-Za-z0-9])?)+(?::.*)?|eui\.[0-9A-Fa-f]{16})\z/s
。
(顺便提一下,您使用/m
是错误的,您对/i
的使用是错误的,\d
的匹配程度远远超过允许的[0-9]
。)< / p>
答案 1 :(得分:0)
如果您只需要:
之前的部分,那么您可以使用以下正则表达式:
if ($target_name =~ /^iqn\.(\d{4}-\d{2})\.([^:]+):/xmi) {
my ($date, $reversed_domain_name) = ($1, $2);
正则表达式[^:]+
与一个或多个非:
符号匹配。即使域名格式不正确,它也会匹配。进一步的改进取决于您的目标:您是否需要获取iSCSI名称的单个组件,还是需要验证其语法?
域名的大小是否有限制?
来自Wikipedia:
完整域名的总长度不得超过253