Board logo

标题: 讨论:用findstr 判断输入的ip是否合法 [打印本页]

作者: 26933062     时间: 2008-5-9 15:39    标题: 讨论:用findstr 判断输入的ip是否合法

用findstr 判断输入的ip是否合法
合法的ip是:   数字.数字.数字.数字 不管数字是多少位都可以。





...

[ Last edited by 26933062 on 2008-5-9 at 04:37 PM ]
作者: huahua0919     时间: 2008-5-9 16:08
findstr 无法匹配准确的IP
因为它会列出整行信息
而且findstr没有匹配零次或一次(?)符

[ Last edited by huahua0919 on 2008-5-9 at 04:13 PM ]
作者: 26933062     时间: 2008-5-9 16:13


  Quote:
Originally posted by huahua0919 at 2008-5-9 16:08:
findstr 无法匹配准确的IP
因为它会列出整行信息

未必。
已经测试出结果了。留着作为一个题目给大家讨论吧。。
作者: huahua0919     时间: 2008-5-9 16:14
能否结果贴出来看,能匹配
255.255.255.0
127.0.0.1
作者: 26933062     时间: 2008-5-9 16:15
题目要求只要是    数字.数字.数字.数字  就是合法ip啊。不管数字是多少位。

[ Last edited by 26933062 on 2008-5-9 at 04:17 PM ]
作者: huahua0919     时间: 2008-5-9 16:18
那肯定不行啊,以数字5开头的能算合法 IP吗?
作者: huahua0919     时间: 2008-5-9 16:27

findstr  "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*"

作者: 26933062     时间: 2008-5-9 16:29
你的会把这些也当作合法ip
.12.23.23
192.002.168..1
12.12.12.
192.1.2.3.5
192..12.12
作者: dikex     时间: 2008-5-9 16:37
用.net等正则表达比较方便……

其实比较简单的方式是ping 一下……
作者: huahua0919     时间: 2008-5-9 16:45
我所做到只能匹配
findstr  "[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9]*[0-9]"
如果想要精确匹配要写很长的,要等会
作者: 26933062     时间: 2008-5-9 16:50
1.2.3.4.5
1.2.3.4.
作者: huahua0919     时间: 2008-5-9 16:55
贴代码出来看看
作者: dikex     时间: 2008-5-9 16:58
10楼的加上^ $ 限制一下
作者: pooronce     时间: 2008-5-9 16:58
一直不知道findstr的正则支持哪些符号,所以一直没派上用场
至少试过好像是不支持{}和+的,用*的话位数就不能确定了,就没法精确匹配了
作者: dikex     时间: 2008-5-9 17:01


  Quote:
Originally posted by pooronce at 2008-5-9 04:58 PM:
一直不知道findstr的正则支持哪些符号,所以一直没派上用场
至少试过好像是不支持{}和+的,用*的话位数就不能确定了,就没法精确匹配了

貌似就只有下面这些了

一般表达式的快速参考:
  .        通配符: 任何字符
  *        重复: 以前字符或类别出现零或零以上次数
  ^        行位置: 行的开始
  $        行位置: 行的终点
  [class]  字符类别: 任何在字符集中的字符
  [^class] 补字符类别: 任何不在字符集中的字符
  [x-y]    范围: 在指定范围内的任何字符
  \x       Escape: 元字符 x 的文字用法
  \<xyz    字位置: 字的开始
  xyz\>    字位置: 字的结束
作者: pooronce     时间: 2008-5-9 17:06
它说了是Regular expression,也说了是“快速参考”,所以我觉得好歹不应该只有这一点的。
但可惜一直找不到它具体支持的列表
作者: huahua0919     时间: 2008-5-9 17:14
基本就那么多吧
?,/d /w /n /r  很多都没用
作者: HAT     时间: 2008-5-10 01:46
在CU潜水时看到的:

匹配IP地址
\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)
\(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\)
作者: joyn     时间: 2008-5-10 02:42
findstr这个命令我用的少~~
作者: 26933062     时间: 2008-5-10 11:58
18楼 HAT 兄弟,能给个完整代码吗?我用你的测试怎么都不对啊??
作者: terse     时间: 2008-5-10 12:19
这样呢
findstr "^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$"
@echo off
set /p ip=请输入IP:
echo %ip%|findstr "^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$">nul||goto err
set ip1=%ip:.= %
call:lp %ip1%
:lp
if "%4"=="" echo ip格式不对&pause&exit
echo 正确
pause&exit
:err
echo ip格式不对&pause&exit

[ Last edited by terse on 2008-5-10 at 12:21 PM ]
作者: slore     时间: 2008-5-10 12:55


  Quote:
Originally posted by terse at 2008-5-10 12:19:
这样呢
findstr "^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$"
@echo off
set /p ip=请输入IP:
echo %ip%|findstr "^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$">nul||goto err
set ip1=%ip:.= ...

256.256.256.256

正确=。=
作者: slore     时间: 2008-5-10 13:14
@echo off
set /p ip=请输入IP:
echo %ip%|findstr "^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$">nul||goto err
set ip1=%ip:.= %
call:lp %ip1%
:lp
if %1 GEQ 232 echo ip格式不对&pause&exit
if %2 GEQ 255 echo ip格式不对&pause&exit
if %3 GEQ 255 echo ip格式不对&pause&exit
if %4 GEQ 255 echo ip格式不对&pause&exit
echo 正确
pause&exit
:err
echo ip格式不对&pause&exit
作者: terse     时间: 2008-5-10 13:21


  Quote:
Originally posted by slore at 2008-5-10 13:14:
@echo off
set /p ip=请输入IP:
echo %ip%|findstr "^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$">nul||goto err
set ip1=%ip:.= %
call:lp %ip1%
:lp
if %1 GEQ 232 echo ip格式不对&pau ...

如果考虑255以上情况  可以简化一下IP标签下
@echo off
set /p ip=请输入IP:
echo %ip%|findstr "^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$">nul||goto err
set ip1=%ip:.= %
call:lp %ip1%
:lp
if "%4"=="" goto err
for %%i in (%ip1%) do if %%i gtr 255 goto err
echo 正确
pause&exit
:err
echo ip格式不对&pause&exit

[ Last edited by terse on 2008-5-10 at 01:23 PM ]
作者: dikex     时间: 2008-5-10 13:24


  Quote:
Originally posted by HAT at 2008-5-10 01:46 AM:
在CU潜水时看到的:

匹配IP地址
\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\)
\(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\)

测试失败……

首先应该没有换行……
将转义字符“\”弄回去后
([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})(([0-9]{1,3}.){3}[0-9]{1,3})

但findstr 貌似不支持 {N} 以及分组,所以这个用不了
作者: 26933062     时间: 2008-5-10 13:26
就是想直接用findstr就判断出格式是否正确,
写了个自己都看不懂的代码,但却可以达到效果。
@echo off
set /p ip=输入ip
set "num=^[0-9]*[0-9]\.[0-9]*[0-9]\.[0-9]*[0-9]\.[0-9]*[0-9]$"
echo %ip%|findstr /x "%num%">nul&&echo ip 正确||echo ip 错误
pause

作者: dikex     时间: 2008-5-10 13:41
[0-9]*[0-9]

所匹配的是数字,且至少是1位,可以是2、3……N位
作者: 26933062     时间: 2008-5-10 13:44
27 楼 没注意楼主要求吧,不需要判断数字的位数,当然能判断更好。
作者: FQ     时间: 2008-5-10 17:01
新手,请各路大侠指教
@echo off&setlocal
:begin
set/p ip=输入IP Address (Format:xxx.xxx.xxx.xxx):
if not defined ip (goto begin)
echo/%ip%|findstr /r "^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$" >nul 2>&1||goto begin
for %%a in ("%ip:.=" "%") do call :QF %%a
echo %keep:~1%
goto:eof
:QF
for /f "delims=0 tokens=*" %%b in (%1) do (
set a=%%b
if not defined a (call:FQ 0) else call:FQ %%b
)
goto:eof
:FQ
if %1 gtr 255 (cls&&echo 错误IP地址如下:)
set keep=%keep%.%1
[ Last edited by FQ on 2008-5-10 at 10:39 PM ]
作者: youling126     时间: 2008-5-10 18:48
findstr还不怎么会用,谁懂的发个贴来介绍介绍
作者: lxmxn     时间: 2008-5-10 22:03
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


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

作者: dikex     时间: 2008-5-10 22:22


  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 ]
作者: lxmxn     时间: 2008-5-10 22:26


  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,……
作者: 26933062     时间: 2008-5-10 22:45
可以匹配0次,也就是说 * 可以不匹配前面的字符,
那么为什么我用字母开头它又不能匹配呢?
echo a.123.2.3|findstr /r "^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$"
它似乎只匹配点开头和数字开头,
作者: dikex     时间: 2008-5-10 22:53
把 ^ 去掉
作者: HAT     时间: 2008-5-11 04:43


  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个或多个任意字符的行。