AutoHotkey RegExReplace与数学

时间:2014-04-08 10:40:25

标签: regex autohotkey

我正在尝试更改xml文件中数字的所有实例。应将常数45添加到数字中。

Temp是以下文字:

<rownum value="1">
  <backupapplication>HP Data Protector</backupapplication>
  <policy>AUTDR12_Daily</policy>
  <policytype>FileSystem</policytype>
  <dataretained>31</dataretained>
  <fullbackup>7</fullbackup>
  <backuptime>0.17</backuptime>
  <retentionperiod>Short</retentionperiod>
  <peakmbps>11</peakmbps>
  <backupcategory>Fulls &amp; Fulls</backupcategory>
</rownum>
<rownum value="2">
  <backupapplication>HP Data Protector</backupapplication>
  <policy>AUTP_Appl_Monthly</policy>
  <policytype>FileSystem</policytype>
  <dataretained>268</dataretained>
  <fullbackup>91</fullbackup>
  <backuptime>2.31</backuptime>
  <retentionperiod>Long</retentionperiod>
  <peakmbps>12</peakmbps>
  <backupcategory>Fulls &amp; Fulls</backupcategory>
</rownum>

我尝试了以下代码:

NeedleRegEx = <rownum value="(\d+)">
Replacement = <rownum value="($1+45)">
Temp := RegExReplace(Temp, NeedleRegEx, Replacement)

但这会将其改为

<rownum value="1+45">

虽然我想要

<rownum value="46">

如何在AutoHotKey中执行此操作?

1 个答案:

答案 0 :(得分:3)

RegEx不是为评估数学表达式而设计的。有些语言可以使用可以进行动态替换的替换函数(例如JavaScript)。但AHK没有这样的运气 无论如何,使用RegEx来解析XML文档并不是一种好的做法。我建议使用XML解析器。对于AHK,您可以使用MSXML2.DOMDocument的COM对象。以下是如何使用它的示例(以及进一步的参考资料):http://www.autohotkey.com/board/topic/56987-com-object-reference-autohotkey-v11/page-2#entry367838 您要做的是将XML解析为DOM文档并循环遍历每个rownum标记。现在,您可以检索value属性,递增它,并使用新值覆盖该属性。

更新

您在评论中发布的代码:有一些小错误和一个大错误。最大的错误是尝试解析无效的XML。您可以通过将XML文件提供给formatter/validator来检查它们。如果存在解析错误,loadXml()方法将返回false。方法obj.saveXML()不存在。如果要检索文档的字符串表示,只需访问其xml属性:obj.xml。如果要将其保存到文件中,则有内置方法save(filepath)

这是我对干净方法的建议(是的,你可以使用有意义的变量名!):

doc := ComObjCreate("MSXML2.DOMDocument.6.0")
if(!doc.loadXml(xmlString)) {
    msgbox % "Hey! That's no valid XML!"
    ExitApp
}

rownums := doc.getElementsByTagName("rownum")
Loop % rownums.length
{
    rownum := rownums.item(A_Index-1)
    value := rownum.getAttribute("value")
    value += 45
    rownum.setAttribute("value", value)
}

doc.save("myNewFile.xml")