我试图找出为什么下面代码中的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%发布于 2013-08-22 12:34:54
AHK regex中的点匹配“不属于换行符(rn)序列__的任何单个字符”。这是一个棘手的部分:默认情况下,Windows文本文件的换行符是rn,而代码中的括号符号由`n字符作为换行符组成。
因此,默认情况下,当遇到rn.时,RegExMatch("FIELDS(.*)KEYS")将停止消费。在有关该文件的示例中,这是在FIELDS之后立即出现的,这使得regex永远不会变为真。
另一方面,变量rn不包含单个TableCode2字符,允许正则表达式到达KEYS。
有许多可能的解决方案,比如从文件中删除每个`r,但最简单和最一致的方法可能是使用简单的DotAll选项。这将导致句点(.)匹配所有字符,包括换行符(通常不匹配换行符)。
得到的正则表达式可能如下所示:s)FIELDS(.*)KEYS。
但是,不应该使用正则表达式来解析非常规语言。如果您控制了输出,可以使用标准格式,比如XML或JSON。如果您正在解析某种编程语言,请使用现有的编译器/解释器来解析它,然后进行转换。
https://stackoverflow.com/questions/18376358
复制相似问题