找回密码
 加入
搜索
查看: 5147|回复: 6

[AU3基础] 【已解决】求教一个正则表达式的写法,哪里有错误(ipconfig中获取IP)?

  [复制链接]
发表于 2011-7-14 16:15:43 | 显示全部楼层 |阅读模式
本帖最后由 xiehuahere 于 2011-7-15 08:57 编辑

经常发现有些机器上WMI不能用,通过微软发布的WMIDiag工具确认的确是环境有问题。但在这种情况下ipconfig命令能正常使用,所以考虑在WMI不行的情况下首先判断是否是英文OS,如果是就使用ipconfig来获取IP,否则就抱歉,处理不了,直接给出错提示。

现在的问题是,StdoutRead函数不像VBS中的ReadLine方法一次读一行,一次读出来好多内容。所以只能通过正则表达式来根据网卡名称取出对应的IP地址。但现在好像不work,求大神帮忙看看。
#include <Constants.au3>

$foo = Run(@ComSpec & " /c " & "ipconfig /all", "", @SW_HIDE, $STDOUT_CHILD)
Local $line = ""
While 1
    $line &= StdoutRead($foo)
    If @error Then ExitLoop
Wend

$oIP = StringRegExpReplace($line, "(?s)Description\s[.\s]+:\s我的网卡名称(?s)IP Address[.\s]+: (\d)+.(\d)+.(\d)+.(\d)+(?s)", '\5.\6.\7.\8')
ConsoleWrite($oIP & @LF)
我是看到官网上有一个ipconfig获取MAC地址的例子这样做的:
http://www.autoitscript.com/foru ... arch__1#entry907434
 楼主| 发表于 2011-7-14 21:11:42 | 显示全部楼层
本帖最后由 xiehuahere 于 2011-7-14 21:18 编辑

认真细致地再看了一遍帮助,发现以上代码至少有两处关键错误:
1) (?s) 本身并不匹配任何东西,只相当于一个使能开关,之前理解有误。(?s) 的作用是使 .  匹配任意一个字符包括换行符(. 默认不匹配换行符)。
2) 要匹配 . 号本身,前面忘记转义了。


更正代码如下(以本机Intel网卡为例测试通过):
#include <Constants.au3>

$foo = Run(@ComSpec & " /c " & "ipconfig /all", "", @SW_HIDE, $STDOUT_CHILD)
Local $line = ""
While 1
    $line &= StdoutRead($foo)
    If @error Then ExitLoop
Wend

$oIP = StringRegExpReplace($line, "(?s).*?Description\s[\.\s]+:\sIntel.*?IP\sAddress[\.\s]+:\s(\d+.\d+.\d+.\d+).*", '$1')
MsgBox(0, "IP", $oIP)
所以说,书读百遍,其义自现。
有时想省点力气来提问一下,结果还是要靠自己才真正解决问题并且记得最牢靠。

但还有两个问题,
1)后面的replace内容为什么是$1 ?
   是不是()里面的就认为是一个matched group text 从而 (?s) 被认为是 $0?
2)有没有简洁的办法判断是否是英文OS? @OSLang 可以返回很多英文版本,一个个code地判断似乎太麻烦。(我知道这个问题已偏离这个帖子的主题了,但还是忍不住要顺便一起搞明白)
发表于 2011-7-14 21:34:29 | 显示全部楼层
$1表示匹配组里的第一个分组中的内容,(?s)是功能开关,不算分组,replace成$1就是说只保留分组1匹配到的结果,其余替换成空
 楼主| 发表于 2011-7-14 23:27:20 | 显示全部楼层
回复 3# kevinch


    谢谢!
   试验一下我就明白了,$0 表示全部匹配的内容,$2为空。
发表于 2011-7-15 04:52:05 | 显示全部楼层
路过,学习了!
 楼主| 发表于 2011-7-15 08:56:21 | 显示全部楼层
问题2)也已解决,变换了很多次关键字终于搜索到了:
http://www.autoitx.com/forum.php ... D%B3%2B%D3%A2%CE%C4
  
通过 StringInStr("0409 0809 0c09 1009 1409 1809 1c09 2009 2409 2809 2c09 3009 3409", @OSLang) 来判断,原来如此简单。
发表于 2013-5-16 13:57:18 | 显示全部楼层
向楼主的学习精神致敬!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-18 17:10 , Processed in 0.079741 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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