需要从这个巨大的字符串中获取作业ID(1618252)并且没有regexp来执行此操作,因为当找不到作业ID时它可能会失败----------
% set invoc [[$this cget -testrun] cget -invocation]
tcl profilemgr -configNetwork {} -startBefore now -releaseUnusedEquip 0 \
-profile ptse1-bsd2 -noreserve 0 -noreplace 0 \
-comment {<a href="/testrunscheduler/schedulerJob.rvt?job_id=1618252">Profile Push: 1618252</a>} \
-attr {} -dur 300minutes -controlAssert 0 -roleSubst {} -offline false -nodb 0 \
-image {} -layer2Mode mapping -checkLeaks 0 -config {} -trace 0 -debug 0 -desc 0 \
-notify 0 -forceProfileIP false -clusterHashingMode simple -doConfig true \
-reservation 0 -projects pts_7_20-latest -flavor {} -platformMix {} \
-releaseReservation 0 -pkgExt {} -emails {} -loadBalancingMode none -enableIOM false \
-checkConn 1 -platform ptsvpl-esxi-lnx -pkgView {} -offlineFailedConn 1 -noall 0 \
-ipMode ipv4 -runType pmgr-run -enableUdpPrioritization false \
-params {profilemgr:profileToPush "ptse1-bsd2" profilemgr:platform "ptsvpl-esxi-lnx"} \
-swtc_view /m/vmurshilly_lab \
{<br>Invocation with all defaults removed => tcl profilemgr -profile "ptse1-bsd2" -comment "<a href="/testrunscheduler/schedulerJob.rvt?job_id=1618252">Profile Push: 1618252</a>" -dur "300minutes" -projects "pts_7_20-latest" -platform "ptsvpl-esxi-lnx" -offlineFailedConn "1"}
我尝试使用regexp本身失败了:
~$tcl
% regexp -all .*job_id=(.*)\"> "supercalafrajilistic" match jobID
0
% puts $jobID
can't read "jobID": no such variable
while evaluating {puts $jobID}
答案 0 :(得分:0)
好吧,你不是针对你提取的字符串运行正则表达式而是仅仅是虚拟的“supercalafrajilistic
”数据;这很重要。您还需要在非贪婪模式下运行正则表达式,但通过这样做,我们可以简化相当多的事情。最后,您应该检查regexp
的结果;在你正在使用的模式中,它返回正则表达式匹配的次数,这实际上是一个布尔测试,如果找到了什么。
set invoc [[$this cget -testrun] cget -invocation]
if {[regexp -all {job_id=(.*?)\"} $invoc -> jobID]} {
puts "the job ID is $jobID; yippee"
} else {
# Up to you how to recover from this failure case...
puts "warning: no job ID found"
}
除此之外,它是Tcl中RE的常见事情(将正则表达式放在括号中,除非你知道你不应该使用->
代替如果您不关心整体匹配字符串的可读性等,请match
。