首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么此自动热键RegExMatch在文本文件上使用但使用变量时会失败?

为什么此自动热键RegExMatch在文本文件上使用但使用变量时会失败?
EN

Stack Overflow用户
提问于 2013-08-22 09:20:28
回答 1查看 1.9K关注 0票数 1

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

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

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

知道这两种情况之间有什么区别吗?为什么我不能与文件相匹配?

代码语言:javascript
复制
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%
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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。如果您正在解析某种编程语言,请使用现有的编译器/解释器来解析它,然后进行转换。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18376358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档