中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-09-28 03:43
共 47,813 主题排行 / 349,918 发帖 / 今日 0 篇 / 48,277 会员排行
DOS批处理 & 脚本技术(批处理室) » 讨论:用findstr 判断输入的ip是否合法
可打印版本  3,299 / 36
第31楼 lxmxn 发表于 2008-05-10 22:03
版主 发帖 4,938 积分 11,386
findstr 所支持的元字符非常有限,很难完成这个正则的匹配,如果是perl或者支持prce的工具,应该能很容易的匹配出正确的IP。



如果大家在Linux下面,可以试试这个regexp:
$ echo '2.2.3.255'|grep -P '^((\b2(?:|5)|1{2}||)\b\.){3}(?:2(?:|5)|1{2}||)$' && echo OK || echo ERROR
2.2.3.255
OK
$ echo '2.2.3.256'|grep -P '^((\b2(?:|5)|1{2}||)\b\.){3}(?:2(?:|5)|1{2}||)$' && echo OK || echo ERROR
ERROR
第32楼 26933062 发表于 2008-05-10 22:16
银牌会员 发帖 879 积分 2,268
令人不解的是为什么这样会可以匹配?
明明指定了要数字开头,为何以点开头的也匹配呢?
:
第33楼 dikex 发表于 2008-05-10 22:22
高级用户 发帖 366 积分 788
Originally posted by 26933062 at 2008-5-10 10:16 PM:
令人不解的是为什么这样会可以匹配?
明明指定了要数字开头,为何以点开头的也匹配呢?
:


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

扔个.net的正则表达式:
^((2\d|25|?\d\d?)\.){3}(2\d|25|?\d\d?)$

[ Last edited by dikex on 2008-5-10 at 10:25 PM ]
第34楼 lxmxn 发表于 2008-05-10 22:26
版主 发帖 4,938 积分 11,386
Originally posted by 26933062 at 2008-5-10 22:16:
令人不解的是为什么这样会可以匹配?
明明指定了要数字开头,为何以点开头的也匹配呢?
:

翻看 findstr /? 手册,里面有说明:
* 重复: 以前字符或类别出现零或零以上次数

可以匹配0次,也就是说 * 可以不匹配前面的字符,即 “ab*c” 可以匹配 abbbbc,abc,abbbc,ac,……
第35楼 26933062 发表于 2008-05-10 22:45
银牌会员 发帖 879 积分 2,268
可以匹配0次,也就是说 * 可以不匹配前面的字符,
那么为什么我用字母开头它又不能匹配呢?
echo a.123.2.3|findstr /r "^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$"
它似乎只匹配点开头和数字开头,
第36楼 dikex 发表于 2008-05-10 22:53
高级用户 发帖 366 积分 788
把 ^ 去掉
第37楼 HAT 发表于 2008-05-11 04:43
版主 发帖 5,017 积分 9,023
Originally posted by 26933062 at 2008-5-10 10:45 PM:
可以匹配0次,也就是说 * 可以不匹配前面的字符,
那么为什么我用字母开头它又不能匹配呢?
echo a.123.2.3|findstr /r "^*\.*\.*\.*$"
它似乎只匹配点开头和数字开头,


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

^*
你这样写就表示要匹配以一位数字开头、后面跟0个或多个任意字符的行。
上一页  1 2 3
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023