如何解决正则表达式以识别给定的IPv4地址是否在Tcl中为“ C”类
这是用于查找IP地址是否属于C类的代码。但是每次我编译时,它都会显示错误。帮我纠正它。
代码:
gets stdin ip
regexp {(19[2-9]|2[0-1]\d|22[0-3])\.(0\d\d|1\d\d|2[0-5][0-5])\.(0\d\d|1\d\d|2[0-5][0-5])\.(0\d\d|1\d\d|2[0-5][0-5])} $ip d
puts "$d is a class c ip address"
解决方法
正确使用prompt=none
正则表达式确实是错误的工具,因为正则表达式并不是真正为解析数字范围而设计的(除非您正在编写低级解析器)。更好地解析成小块,然后使用数字检查。
scan
建议在解析之前使用Tcllib ip package中的# Check that the string contains a dotted quad
if {
[scan $ip "%d.%d.%d.%d" a b c d] == 4 &&
($a >= 192 && $a <= 223) &&
($b >= 0 && $b <= 255) &&
($c >= 0 && $c <= 255) &&
($d >= 0 && $d <= 255)
} then {
puts "$ip is a class C IP address"
}
,以便应对实际上是合法IP地址的奇怪事物。
ip::normalize
如果有人给您不好的输入,您将得到一个很好的清晰错误,描述问题所在,而不是一个奇怪的程序。
使用正则表达式
这种事情就是Zawinski的格言存在的原因:
有些人遇到问题时会认为“我知道,我会使用正则表达式”。现在他们有两个问题。
对于某些问题,正则表达式是正确的解决方案。 这不是他们之一!
如果必须使用正则表达式,请尝试以下操作:
package require ip
# Note the simpler expression: normalizing handles the awkward cases for us
scan [ip::normalize $ip] "%d.%d.%d.%d" a b c d
if {$a >= 192 && $a <= 223} {
puts "$ip is a class C IP address"
}
是的,这太可怕了。这是展开形式,带有一些注释。
regexp {^(?:19[2-9]|2[0-1]\d|22[0-3])(?:\.(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){3}$} $ip d
如此混乱的原因在于处理了这些数字范围;可再生能源根本不是一个很好的工具。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。