为什么这个Autohotkey RegExMatch在文本文件上使用时失败但是从变量开始工作?

时间:2013-08-22 09:20:29

标签: regex autohotkey

我正在尝试找出当我在从文件读取的变量上使用它时,以下代码中的RegExMatch命令失败的原因。当我将文件内容直接分配给AHK中的变量时,它可以工作。

要测试此功能,请打开记事本,将TableCode2的多行内容复制到记事本中并将其另存为c:\ temp \ testtable.txt

当我运行脚本时,第一个消息框不显示匹配项。 第二个盒子匹配。我在windows7 32bit和64bit上测试过这个。

知道两种情况之间的区别是什么以及为什么我无法匹配 反对文件?

InputTable = c:\temp\testtable.txt
FileRead, TableCode, %InputTable%

TableCode2 =
(
OBJECT Table 50093 test
{
  OBJECT-PROPERTIES
  {
    Date=22.08.13;
    Time=10:47:20;
  }
  PROPERTIES
  {
  }
  FIELDS
  {
    { 1   ;   ;test                ;Text30         }
  }
  KEYS
  {
    {    ;test                                    ;Clustered=Yes }
  }
  CODE
  {

    BEGIN
    END.
  }
}
)

Needle := "FIELDS(.*)KEYS"
Foundpos := RegExMatch(TableCode,Needle,Out)
msgbox, %Needle%`n %Out1%`n--------------%TableCode%

Foundpos := RegExMatch(TableCode2,Needle,Out)
msgbox, %Needle%`n %Out1%`n--------------%TableCode%

1 个答案:

答案 0 :(得分:2)

AHK正则表达式中的匹配“任何单个字符,它不属于换行符(`r`n)序列。 这是一个棘手的部分:Windows文本文件的换行符默认为`r`n ,而代码中的括号表示法由`n 字符作为换行符组成。
因此,RegExMatch("FIELDS(.*)KEYS")默认会在遇到`r`n 时停止消费。在您关于文件的示例中,这是在FIELDS之后,不允许正则表达式变为真实。
另一方面,变量TableCode2不包含单个`r`n 字符,允许正则表达式达到KEYS
有很多可能的解决方案,比如从文件中删除每个`r ,但最简单和最一致的方法是使用简单的DotAll选项。 “这会导致句点(。)匹配包括换行符在内的所有字符(通常,它与换行符不匹配)。
生成的正则表达式可能如下所示:s)FIELDS(.*)KEYS

但是,不应该使用正则表达式来解析不是常规语言的内容。如果您可以控制输出,请使用XML或JSON等标准化格式。如果要解析某种编程语言,请使用现有的编译器/解释器对其进行解析,然后将其转换。