中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-28 07:08
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 讨论:用findstr 判断输入的ip是否合法 查看 2,743 回复 36
31 发表于 2008-05-10 22:03 ·  中国 湖北 武汉 联通
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
19年会员
UID 59080
状态 离线
findstr 所支持的元字符非常有限,很难完成这个正则的匹配,如果是perl或者支持prce的工具,应该能很容易的匹配出正确的IP。

echo.1.20.3.45|findstr /r "^*\.*\.*\.*$"


如果大家在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 发表于 2008-05-10 22:16 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
令人不解的是为什么这样会可以匹配?
明明指定了要数字开头,为何以点开头的也匹配呢?
:

@echo off
echo .123.2.3|findstr /r "^*\.*\.*\.*$"
致精致简!
33 发表于 2008-05-10 22:22 ·  中国 广东 广州 天河区 电信
高级用户
★★★
潜水修练批处理
积分 788
发帖 366
注册 2006-12-31 02:43
19年会员
UID 75048
性别 男
状态 离线
Originally posted by 26933062 at 2008-5-10 10:16 PM:
令人不解的是为什么这样会可以匹配?
明明指定了要数字开头,为何以点开头的也匹配呢?
:

@echo off
echo .123.2.3|findstr /r "^*\.*\.*\.*$"


因为 * 代表前面的字符重复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 发表于 2008-05-10 22:26 ·  中国 湖北 武汉 联通
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
19年会员
UID 59080
状态 离线
Originally posted by 26933062 at 2008-5-10 22:16:
令人不解的是为什么这样会可以匹配?
明明指定了要数字开头,为何以点开头的也匹配呢?
:

@echo off
echo .123.2.3|findstr /r "^*\.*\.*\.*$"

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

可以匹配0次,也就是说 * 可以不匹配前面的字符,即 “ab*c” 可以匹配 abbbbc,abc,abbbc,ac,……
35 发表于 2008-05-10 22:45 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
可以匹配0次,也就是说 * 可以不匹配前面的字符,
那么为什么我用字母开头它又不能匹配呢?
echo a.123.2.3|findstr /r "^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$"
它似乎只匹配点开头和数字开头,
致精致简!
36 发表于 2008-05-10 22:53 ·  中国 广东 广州 天河区 电信
高级用户
★★★
潜水修练批处理
积分 788
发帖 366
注册 2006-12-31 02:43
19年会员
UID 75048
性别 男
状态 离线
把 ^ 去掉
正在潜水修练的批处理小白
37 发表于 2008-05-11 04:43 ·  中国 上海 联通
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
19年会员
UID 89899
性别 男
状态 离线
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个或多个任意字符的行。
论坛跳转: