1

我试图找出为什么当我在从文件中读取的变量上使用下面代码中的 RegExMatch 命令时会失败。当我将文件内容直接分配给 AHK 中的变量时,它就起作用了。

为了测试这个,打开记事本,将 TableCode2 的多行内容复制到记事本中并保存为 c:\temp\testtable.txt

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

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

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%
4

1 回答 1

2

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

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

于 2013-08-22T12:34:54.550 回答