返回列表 发帖

[文本处理] [已解决]批处理findstr命令正则方式怎样识别IP地址?

本帖最后由 mxxcgzxxx 于 2011-6-28 07:08 编辑

我想用正则识别IP的输入正确性,写了以下程序,识别范围 1.0.0.1~255.255.255.254
给了出错信息“输入行太长”
首先说明方法没错,用这个方法,只识别1.0.0.~255.255.255. 能正确识别
@echo off
setlocal enabledelayedexpansion
set "ip11=^2[0-5][0-5]"
set "ip12=^1[0-9][0-9]"
set "ip13=^[1-9][0-9]"
set "ip14=^[1-9]"
set "ip21=2[0-5][0-5]"
set "ip22=1[0-9][0-9]"
set "ip23=[1-9][0-9]"
set "ip24=[0-9]"
set "ip31=2[0-5][0-5]"
set "ip32=1[0-9][0-9]"
set "ip33=[1-9][0-9]"
set "ip34=[1-9]"
set "ip41=2[0-5][0-4]$"
set "ip42=1[0-9][0-9]$"
set "ip43=[1-9][0-9]$"
set "ip44=[1-9]$"
set "ipyu="
for /l %%a in (1,1,4) do  for /l %%b in (1,1,4) do for /l %%c in (1,1,4) do for /l %%d in (1,1,4) do set "ipyu=!ip1%%a![.]!ip2%%b![.]!ip3%%c![.]!ip4%%d! !ipyu!"
set ipyu
pause
:1
set/p p=
echo %p%| findstr "%ipyu%">nul && echo %p% 正确
pause
goto :1 COPY
想问以下几个问题:
(1) findstr 正则表达式能支持多长的字符串?
(2) 有更简易高效的识别方法吗?
(3) 能通过多通道进行多层筛选达到相同的效果吗?
(4) 如果可能的话,我想拓展成识别
      (10.0.0.1~10.255.255.254)
         (172.16.0.1~172.31.255.254)
         (192.168.0.1~192.168.255.254)
     让这三段地址同时有效,其他一律排除

同时点发现共享下,不知和你们的一样不:多次测试发现单次 findstr 正则 时间基本在0.12秒,
所以不用FOR的情况下正则比FOR+IF排选更快,
如果在FOR下进行正则就速度很慢了,因为速度为n*0.12 秒
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2
世界上没有学不会的知识,也没有想得到却做不到的事!

为什么一定用findstr命令呢
@echo off
:ip
cls
set/p ip=请输入IP(如:192.168.1.1)
echo %ip%|findstr "^[0-9]*.[0-9]*.[0-9]*.[0-9]*$"||(echo 输入行太长&pause>nul&goto :ip)
for /f "tokens=1,2,3,4 delims=." %%i in ("%ip%") do (
if %%i gtr 255 (echo 输入行太长&pause>nul&goto :ip)
if %%j gtr 255 (echo 输入行太长&pause>nul&goto :ip)
if %%k gtr 255 (echo 输入行太长&pause>nul&goto :ip)
if %%l geq 255 (echo 输入行太长&pause>nul&goto :ip)
)
pauseCOPY
1

评分人数

TOP

本帖最后由 mxxcgzxxx 于 2011-6-27 21:12 编辑

2# 601997526
首段不能为0
尾段不能为0或255
不过受启发,改如下
@echo off
set "ip1=^2[0-5][0-5]$ ^1[0-9][0-9]$ ^[1-9][0-9]$ ^[1-9]$"
set "ip2=^2[0-5][0-5]$ ^1[0-9][0-9]$ ^[1-9][0-9]$ ^[0-9]$"
set "ip3=^2[0-5][0-4]$ ^1[0-9][0-9]$ ^[1-9][0-9]$ ^[1-9]$"
:ip
cls
set/p ip=请输入IP(如:192.168.1.1)
echo %ip%|findstr "^[0-9]*.[0-9]*.[0-9]*.[0-9]*$"||goto :ip
for /f "tokens=1,2,3,4 delims=." %%i in ("%ip%") do (
echo %%i|findstr "%ip1%"||goto :ip
echo %%j|findstr "%ip2%"||goto :ip
echo %%k|findstr "%ip2%"||goto :ip
echo %%l|findstr "%ip3%"||goto :ip
)
echo 正确
pause>nul
goto :ipCOPY
能再提供多点思路吗

加强版,解决问题4,识别用时0.58秒
@echo off
set "ip1=^10$ ^172$ ^192$"
set "ip2=^2[0-5][0-5]$ ^1[0-9][0-9]$ ^[1-9][0-9]$ ^[0-9]$"
set "ip3=^2[0-5][0-4]$ ^1[0-9][0-9]$ ^[1-9][0-9]$ ^[1-9]$"
set "ip4=^1[6-9]$ ^2[0-9]$ ^3[0-1]$"
:ip
cls
set/p ip=请输入IP(如:192.168.1.1)
echo %ip%|findstr "^[0-9]*.[0-9]*.[0-9]*.[0-9]*$">nul||pause&&goto :ip
for /f "tokens=1,2,3,4 delims=." %%i in ("%ip%") do (
echo %%i|findstr "%ip1%">nul||goto :ip
echo %%k|findstr "%ip2%">nul||goto :ip
echo %%l|findstr "%ip3%">nul||goto :ip
if %%i==10 echo %%j|findstr "%ip2%">nul||goto :ip
if %%i==172 echo %%j|findstr "%ip4%">nul||goto :ip
if %%i==192 echo %%j|findstr "^168$">nul||goto :ip
)
echo 正确
pause>nul
goto :ipCOPY
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

排除法:
findstr /v "[0-9][0-9][0-9][0-9] [3-9][0-9][0-9] 2[6][0-9] 25[6-9]"COPY

TOP

4# zm900612

能具体点吗,好像排除法更麻烦?
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

本帖最后由 zm900612 于 2011-6-28 12:40 编辑

1,以正则表达式来解析关键词的时候,findstr单条关键词上限255字节,多条之间不累加,find命令的关键词似乎无上限
2,3,4,这三个问题都可以用两条findstr进行正反筛选来解决,虽然效率比单个findstr慢,但是更容易写,findstr一般不会进入循环,所以很多时候能用多层来简化代码就不需要太顾虑运行效率,因为为了省下那点运行耗时,往往要花数十倍的时间去构造关键词
1

评分人数

TOP

批处理很好用哟 谢谢 正需要这个



















高清桌面壁纸 电脑桌面壁纸 www.ugamesgold.com

TOP

1,以正则表达式来解析关键词的时候,findstr单条关键词上限255字节,多条之间不累加,find命令的关键词似乎无上限
2,3,4,这三个问题都可以用两条findstr进行正反筛选来解决,虽然效率比单个findstr慢,但是更容 ...
zm900612 发表于 2011-6-28 12:36


汗,255,我还以为是3000多,是少了点
感谢技术参数的支持
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

返回列表