标题: [文本处理] [已解决]批处理findstr命令正则方式怎样识别IP地址? [打印本页]
作者: mxxcgzxxx 时间: 2011-6-27 18:40 标题: [已解决]批处理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
复制代码
想问以下几个问题:
(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 秒
作者: 601997526 时间: 2011-6-27 19:56
为什么一定用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)
- )
- pause
复制代码
作者: mxxcgzxxx 时间: 2011-6-27 20:11
本帖最后由 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 :ip
复制代码
能再提供多点思路吗
加强版,解决问题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 :ip
复制代码
作者: CrLf 时间: 2011-6-27 20:45
排除法:- findstr /v "[0-9][0-9][0-9][0-9] [3-9][0-9][0-9] 2[6][0-9] 25[6-9]"
复制代码
作者: mxxcgzxxx 时间: 2011-6-27 23:13
4# zm900612
能具体点吗,好像排除法更麻烦?
作者: CrLf 时间: 2011-6-28 12:36
本帖最后由 zm900612 于 2011-6-28 12:40 编辑
1,以正则表达式来解析关键词的时候,findstr单条关键词上限255字节,多条之间不累加,find命令的关键词似乎无上限
2,3,4,这三个问题都可以用两条findstr进行正反筛选来解决,虽然效率比单个findstr慢,但是更容易写,findstr一般不会进入循环,所以很多时候能用多层来简化代码就不需要太顾虑运行效率,因为为了省下那点运行耗时,往往要花数十倍的时间去构造关键词
作者: liupei261845 时间: 2011-6-28 16:06
批处理很好用哟 谢谢 正需要这个
高清桌面壁纸 电脑桌面壁纸 www.ugamesgold.com
作者: mxxcgzxxx 时间: 2011-6-28 16:30
1,以正则表达式来解析关键词的时候,findstr单条关键词上限255字节,多条之间不累加,find命令的关键词似乎无上限
2,3,4,这三个问题都可以用两条findstr进行正反筛选来解决,虽然效率比单个findstr慢,但是更容 ...
zm900612 发表于 2011-6-28 12:36
汗,255,我还以为是3000多,是少了点
感谢技术参数的支持
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |