xiehuahere 发表于 2011-7-14 16:15:43

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

本帖最后由 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/forum/topic/126754-retrieve-a-system-mac-address-from-ipconfig-all/page__p__907434__hl__stdoutread+line__fromsearch__1#entry907434

xiehuahere 发表于 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地判断似乎太麻烦。(我知道这个问题已偏离这个帖子的主题了,但还是忍不住要顺便一起搞明白)

kevinch 发表于 2011-7-14 21:34:29

$1表示匹配组里的第一个分组中的内容,(?s)是功能开关,不算分组,replace成$1就是说只保留分组1匹配到的结果,其余替换成空

xiehuahere 发表于 2011-7-14 23:27:20

回复 3# kevinch


    谢谢!
   试验一下我就明白了,$0 表示全部匹配的内容,$2为空。

user3000 发表于 2011-7-15 04:52:05

路过,学习了!

xiehuahere 发表于 2011-7-15 08:56:21

问题2)也已解决,变换了很多次关键字终于搜索到了:
http://www.autoitx.com/forum.php?mod=viewthread&tid=15356&highlight=%B2%D9%D7%F7%CF%B5%CD%B3%2B%D3%A2%CE%C4

通过 StringInStr("0409 0809 0c09 1009 1409 1809 1c09 2009 2409 2809 2c09 3009 3409", @OSLang) 来判断,原来如此简单。
{:face (396):}

guti_8014 发表于 2013-5-16 13:57:18

向楼主的学习精神致敬!
页: [1]
查看完整版本: 【已解决】求教一个正则表达式的写法,哪里有错误(ipconfig中获取IP)?