正则表达式判断ip

紫色冷夜 2014-04-14 10:11:13
为何下面的不能正确判断ip地址格式是否正确
		
String chekString="[1-255]\\.[0-255]\\.[0-255]\\.[0-255]$";
String ip="192.168.1.1";
if (ip.matches(chekString))
{
System.out.println("是一个正确的ip");

}
else
{
System.out.println("不是一个正确的ip");
}

运行结果是:不是一个正确的ip
...全文
187 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
momoyssy 2014-04-14
  • 打赏
  • 举报
回复
引用 8 楼 u012876427 的回复:
[quote=引用 5 楼 momoyssy 的回复:] 正则表达式中是按照字符去单个匹配的,匹配内容都会看作是单个字符.[1-255]这种写法会被认为是,1到2的所有数字表示的字符,以及为5的字符都会被配匹.所以 [1-255]\\.[0-255]\\.[0-255]\\.[0-255]$这个表达式能匹配的是 125.0125.0125.0125(每个点隔开的数字中有且只能有一个).如 1.0.1.2 这样的格式. 楼主可以参考这个表达式 ([1-9])|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]) 匹配(1-255) 把第一个1改成0就可以匹配 0-255 了.
		String ip="199.168.4.5";
		String xy="(\\d|1\\d{0,2}|24\\d|25[0-5])";
		String chekString=xy+"\\."+xy+"\\."+xy+"\\."+xy;
		if (ip.matches(chekString))
		{
			System.out.println("是一个正确的ip");
			
		}
		else
		{
			System.out.println("不是一个正确的ip");
		}
我是这样写的也成功了[/quote]你这样写除了可以匹配出正确的IP外还会匹配出不正确的IP,比如当数字大于255时,比如是256,也是匹配成功的.匹配值为6.168.4.5.
String ip = "256.168.4.5";
		String xy = "(\\d|1\\d{0,2}|24\\d|25[0-5])";
		String chekString = xy + "\\." + xy + "\\." + xy + "\\." + xy;
		Pattern pat = Pattern.compile(chekString);
		Matcher mat = pat.matcher(ip);
		while (mat.find()) {
			System.out.println(mat.group());
		}
另外,先谢谢你的好意,转分就不用了,我回答问题不是为了分,共同学习,共同进步.
紫色冷夜 2014-04-14
  • 打赏
  • 举报
回复
引用 5 楼 momoyssy 的回复:
正则表达式中是按照字符去单个匹配的,匹配内容都会看作是单个字符.[1-255]这种写法会被认为是,1到2的所有数字表示的字符,以及为5的字符都会被配匹.所以 [1-255]\\.[0-255]\\.[0-255]\\.[0-255]$这个表达式能匹配的是 125.0125.0125.0125(每个点隔开的数字中有且只能有一个).如 1.0.1.2 这样的格式. 楼主可以参考这个表达式 ([1-9])|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]) 匹配(1-255) 把第一个1改成0就可以匹配 0-255 了.
		String ip="199.168.4.5";
		String xy="(\\d|1\\d{0,2}|24\\d|25[0-5])";
		String chekString=xy+"\\."+xy+"\\."+xy+"\\."+xy;
		if (ip.matches(chekString))
		{
			System.out.println("是一个正确的ip");
			
		}
		else
		{
			System.out.println("不是一个正确的ip");
		}
我是这样写的也成功了
紫色冷夜 2014-04-14
  • 打赏
  • 举报
回复
引用 5 楼 momoyssy 的回复:
正则表达式中是按照字符去单个匹配的,匹配内容都会看作是单个字符.[1-255]这种写法会被认为是,1到2的所有数字表示的字符,以及为5的字符都会被配匹.所以 [1-255]\\.[0-255]\\.[0-255]\\.[0-255]$这个表达式能匹配的是 125.0125.0125.0125(每个点隔开的数字中有且只能有一个).如 1.0.1.2 这样的格式. 楼主可以参考这个表达式 ([1-9])|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]) 匹配(1-255) 把第一个1改成0就可以匹配 0-255 了.
谢谢,不知道能不能转账能的话我给你转点分
紫色冷夜 2014-04-14
  • 打赏
  • 举报
回复
引用 4 楼 u012724379 的回复:
[]:匹配一个中括号内的字符;
[0-9]  [a-z]  [a-zA-Z]
刚开始以为字符可以使用数字表示,我在这测试了几遍数字一旦超过9不行了谢谢了,大侠请接分
momoyssy 2014-04-14
  • 打赏
  • 举报
回复
正则表达式中是按照字符去单个匹配的,匹配内容都会看作是单个字符.[1-255]这种写法会被认为是,1到2的所有数字表示的字符,以及为5的字符都会被配匹.所以 [1-255]\\.[0-255]\\.[0-255]\\.[0-255]$这个表达式能匹配的是 125.0125.0125.0125(每个点隔开的数字中有且只能有一个).如 1.0.1.2 这样的格式. 楼主可以参考这个表达式 ([1-9])|([1-9][0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]) 匹配(1-255) 把第一个1改成0就可以匹配 0-255 了.
-江沐风- 2014-04-14
  • 打赏
  • 举报
回复
[]:匹配一个中括号内的字符;
[0-9]  [a-z]  [a-zA-Z]
suciver 2014-04-14
  • 打赏
  • 举报
回复
引用 2 楼 u012876427 的回复:
[quote=引用 1 楼 suciver 的回复:] 楼主这个正则的意思是"1-2或者5中的一个数字后面跟.接着0-2或5中的一个数字后面跟.接着0-2或5中的一个数字后面跟.最后0-2或5中的一个数字"
为嘛是1-2或者5中的一个数字,不是1-255中的一个数字?[/quote] 正则中"[]"里面代表的都只有一个字符。这些说明看JDK API中java.util.regex.Pattern的说明楼主就清楚了
紫色冷夜 2014-04-14
  • 打赏
  • 举报
回复
引用 1 楼 suciver 的回复:
楼主这个正则的意思是"1-2或者5中的一个数字后面跟.接着0-2或5中的一个数字后面跟.接着0-2或5中的一个数字后面跟.最后0-2或5中的一个数字"
为嘛是1-2或者5中的一个数字,不是1-255中的一个数字?
suciver 2014-04-14
  • 打赏
  • 举报
回复
楼主这个正则的意思是"1-2或者5中的一个数字后面跟.接着0-2或5中的一个数字后面跟.接着0-2或5中的一个数字后面跟.最后0-2或5中的一个数字"

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧