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