[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

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

我想用正则识别IP的输入正确性,写了以下程序,识别范围 1.0.0.1~255.255.255.254
给了出错信息“输入行太长”
首先说明方法没错,用这个方法,只识别1.0.0.~255.255.255. 能正确识别
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set "ip11=^2[0-5][0-5]"
  4. set "ip12=^1[0-9][0-9]"
  5. set "ip13=^[1-9][0-9]"
  6. set "ip14=^[1-9]"
  7. set "ip21=2[0-5][0-5]"
  8. set "ip22=1[0-9][0-9]"
  9. set "ip23=[1-9][0-9]"
  10. set "ip24=[0-9]"
  11. set "ip31=2[0-5][0-5]"
  12. set "ip32=1[0-9][0-9]"
  13. set "ip33=[1-9][0-9]"
  14. set "ip34=[1-9]"
  15. set "ip41=2[0-5][0-4]$"
  16. set "ip42=1[0-9][0-9]$"
  17. set "ip43=[1-9][0-9]$"
  18. set "ip44=[1-9]$"
  19. set "ipyu="
  20. 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!"
  21. set ipyu
  22. pause
  23. :1
  24. set/p p=
  25. echo %p%| findstr "%ipyu%">nul && echo %p% 正确
  26. pause
  27. 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 秒
1

评分人数

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

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

评分人数

TOP

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

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

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

TOP

排除法:
  1. findstr /v "[0-9][0-9][0-9][0-9] [3-9][0-9][0-9] 2[6][0-9] 25[6-9]"
复制代码

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

返回列表