中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 讨论:用findstr 判断输入的ip是否合法
« [1] [2] [3] »
作者:
标题: 讨论:用findstr 判断输入的ip是否合法 上一主题 | 下一主题
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 31 楼』:  

findstr 所支持的元字符非常有限,很难完成这个正则的匹配,如果是perl或者支持prce的工具,应该能很容易的匹配出正确的IP。
echo.1.20.3.45|findstr /r "^[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*\.[1-9][0-9]*$"
如果大家在Linux下面,可以试试这个regexp:

  Quote:
$ echo '2.2.3.255'|grep -P '^((\b2(?:[0-4][0-9]|5[1-5])|1[0-9]{2}|[1-9][0-9]|[0-9])\b\.){3}(?:2(?:[0-4][0-9]|5[1-5])|1[0-9]{2}|[1-9][0-9]|[0-9])$' && echo OK || echo ERROR
2.2.3.255
OK
$ echo '2.2.3.256'|grep -P '^((\b2(?:[0-4][0-9]|5[1-5])|1[0-9]{2}|[1-9][0-9]|[0-9])\b\.){3}(?:2(?:[0-4][0-9]|5[1-5])|1[0-9]{2}|[1-9][0-9]|[0-9])$' && echo OK || echo ERROR
ERROR



2008-5-10 22:03
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 32 楼』:  

令人不解的是为什么这样会可以匹配?
明明指定了要数字开头,为何以点开头的也匹配呢?
:
@echo off
echo .123.2.3|findstr /r "^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$"




致精致简!
2008-5-10 22:16
查看资料  发短消息 网志   编辑帖子  回复  引用回复
dikex
高级用户

潜水修练批处理



积分 788
发帖 366
注册 2006-12-31
状态 离线
『第 33 楼』:  



  Quote:
Originally posted by 26933062 at 2008-5-10 10:16 PM:
令人不解的是为什么这样会可以匹配?
明明指定了要数字开头,为何以点开头的也匹配呢?
:
@echo off
echo .123.2.3|findstr /r "^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$"

因为 * 代表前面的字符重复0次或者以上
所以下面这个也可以
echo ...|findstr /r "^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$"

扔个.net的正则表达式:
^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$

[ Last edited by dikex on 2008-5-10 at 10:25 PM ]



正在潜水修练的批处理小白
2008-5-10 22:22
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 34 楼』:  



  Quote:
Originally posted by 26933062 at 2008-5-10 22:16:
令人不解的是为什么这样会可以匹配?
明明指定了要数字开头,为何以点开头的也匹配呢?
:
@echo off
echo .123.2.3|findstr /r "^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$"

翻看 findstr /? 手册,里面有说明:

  Quote:
  *        重复: 以前字符或类别出现零或零以上次数

可以匹配0次,也就是说 * 可以不匹配前面的字符,即 “ab*c” 可以匹配 abbbbc,abc,abbbc,ac,……

2008-5-10 22:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 35 楼』:  

可以匹配0次,也就是说 * 可以不匹配前面的字符,
那么为什么我用字母开头它又不能匹配呢?
echo a.123.2.3|findstr /r "^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$"
它似乎只匹配点开头和数字开头,



致精致简!
2008-5-10 22:45
查看资料  发短消息 网志   编辑帖子  回复  引用回复
dikex
高级用户

潜水修练批处理



积分 788
发帖 366
注册 2006-12-31
状态 离线
『第 36 楼』:  

把 ^ 去掉



正在潜水修练的批处理小白
2008-5-10 22:53
查看资料  发短消息 网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 37 楼』:  



  Quote:
Originally posted by 26933062 at 2008-5-10 10:45 PM:
可以匹配0次,也就是说 * 可以不匹配前面的字符,
那么为什么我用字母开头它又不能匹配呢?
echo a.123.2.3|findstr /r "^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$"
它似乎只匹配点开头和数字开头,

findstr的帮助里面有答案:
  *        Repeat: zero or more occurances of previous character or class
  ^        Line position: beginning of line
  $        Line position: end of line

^[0-9]*
你这样写就表示要匹配以一位数字开头、后面跟0个或多个任意字符的行。

2008-5-11 04:43
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: