我正在尝试找出当我在从文件读取的变量上使用它时,以下代码中的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%
答案 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等标准化格式。如果要解析某种编程语言,请使用现有的编译器/解释器对其进行解析,然后将其转换。