找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 36152|回复: 7

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

[复制链接]
发表于 2011-6-27 18:40:43 | 显示全部楼层 |阅读模式
本帖最后由 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 秒

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2011-6-27 19:56:18 | 显示全部楼层
为什么一定用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技术 +1 收起 理由
mxxcgzxxx + 1 乐于助人

查看全部评分

 楼主| 发表于 2011-6-27 20:11:29 | 显示全部楼层
本帖最后由 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
复制代码
发表于 2011-6-27 20:45:44 | 显示全部楼层
排除法:
  1. findstr /v "[0-9][0-9][0-9][0-9] [3-9][0-9][0-9] 2[6][0-9] 25[6-9]"
复制代码
 楼主| 发表于 2011-6-27 23:13:52 | 显示全部楼层
4# zm900612

能具体点吗,好像排除法更麻烦?
发表于 2011-6-28 12:36:57 | 显示全部楼层
本帖最后由 zm900612 于 2011-6-28 12:40 编辑

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

评分

参与人数 1技术 +1 收起 理由
mxxcgzxxx + 1 感谢技术支持

查看全部评分

发表于 2011-6-28 16:06:17 | 显示全部楼层
批处理很好用哟 谢谢 正需要这个



















高清桌面壁纸 电脑桌面壁纸 www.ugamesgold.com
 楼主| 发表于 2011-6-28 16:30:58 | 显示全部楼层
1,以正则表达式来解析关键词的时候,findstr单条关键词上限255字节,多条之间不累加,find命令的关键词似乎无上限
2,3,4,这三个问题都可以用两条findstr进行正反筛选来解决,虽然效率比单个findstr慢,但是更容 ...
zm900612 发表于 2011-6-28 12:36


汗,255,我还以为是3000多,是少了点
感谢技术参数的支持
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 17:07 , Processed in 0.023188 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表