Problem A: IP判断

"
Time Limit $1$ 秒/Second(s) Memory Limit $512$ 兆字节/Megabyte(s)
提交总数 $4582$ 正确数量 $2964$
裁判形式 标准裁判/Standard Judge 我的状态 尚未尝试
难度 分类标签 字符串 正则表达式 编译原理 Java高级编程
在基于Internet的程序中,我们常常需要判断一个IP字符串的合法性。
合法的IP是这样的形式:
A.B.C.D
其中A、B、C、D均为位于[0, 255]中的整数。为了简单起见,我们规定这四个整数中不允许有前导零存在,如001这种情况。
现在,请你来完成这个判断程序吧^_^

输入由多行组成,每行是一个字符串。
字符串长度最大为30,且不含空格和不可见字符

对于每一个输入,单独输出一行
如果该字符串是合法的IP,输出Y,否则,输出N

1.2.3.4
a.b.c.d
267.43.64.12
12.34.56.bb
210.43.64.129
-123.4.5.6
Y
N
N
N
Y
N
String regex="^(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}$";

  • ^…$:要求整个字符串都匹配,不允许有多余字符;
  • 第 1 组:IP 地址的第 1 段;
  • (\....){3}:后面再重复 3 次 “点 + 一段”,凑成 4 段;
  • 因此整条正则表达式的语义就是 “4 个 0~255 的数字,用点分隔”。
(在 Java 字符串里写\\d表示正则中的\d,写\\.表示字面点.,因为在字符串里要再转义一层。)

核心:一段 0~255 是怎么表示的

25[0-5]  |  2[0-4]\d  |  [0-1]?\d?\d
三个分支按数值区间划分,正好覆盖 0~255,且不重叠:
分支 含义 覆盖范围
25[0-5] 25 开头,末位 0~5 250~255
2[0-4]\d 2 开头,第二位 0~4 200~249
[0-1]?\d?\d 0 或 1 可选,后接 1~2 位数字  0~199

AOJ