我一直在尝试编写正则表达式来验证文件,以确保其遵循特定格式。该文件应该有一个
这是一个有效文件的示例:
作为测试,我创建了以下Perl示例:
正如您所看到的,文本中有一行“垃圾”文本,应该使其无效,但是由于某种原因,Perl仍然认为这个文本是有效的!当我运行这段代码时,它会产生以下输出:
我花了几个小时的时间来追踪我的正则表达式哪里出了问题,但我就是看不出来。我甚至使用了一个在线正则表达式测试工具来测试这个正则表达式,根据测试结果,我的正则表达式应该没问题!(如果您想查看在格式正确时它是否匹配正确,请尝试删除“垃圾”行。) 这让我整整一天都感到困惑,并让我怀疑Perl正则表达式引擎本身是否存在错误。请问有人能告诉我为什么这会匹配而不应该匹配吗?
我正在使用perl v5.20.1
version();
行,然后是一个或多个element();
块。这是一个有效文件的示例:
version(1.0);
element
(
);
element
(
);
element
(
);
作为测试,我创建了以下Perl示例:
use strict;
use warnings;
my $text = <<'END_TEXT';
version(1.0);
element
(
);
garbage <--- THIS SHOULD NOT MATCH!
element
(
);
element
(
);
END_TEXT
my $rx_defs = qr{(?(DEFINE)
(?<valid_text>
\A\s*(?&version)\s*
(?: (?&element) \s* )+
\s*\Z
)
(?<version>
version\(.+?\);
)
(?<element>
element\s*
(?&element_body);
)
(?<element_body>
\( (?: [^()]++ | (?&element_body) )* \)
)
)}xms;
if ($text =~ m/(?&valid_text)$rx_defs/) {
print "match";
}
正如您所看到的,文本中有一行“垃圾”文本,应该使其无效,但是由于某种原因,Perl仍然认为这个文本是有效的!当我运行这段代码时,它会产生以下输出:
match
我花了几个小时的时间来追踪我的正则表达式哪里出了问题,但我就是看不出来。我甚至使用了一个在线正则表达式测试工具来测试这个正则表达式,根据测试结果,我的正则表达式应该没问题!(如果您想查看在格式正确时它是否匹配正确,请尝试删除“垃圾”行。) 这让我整整一天都感到困惑,并让我怀疑Perl正则表达式引擎本身是否存在错误。请问有人能告诉我为什么这会匹配而不应该匹配吗?
我正在使用perl v5.20.1
version\(.+?\);
- 括号中可能包含元素和垃圾内容。考虑限制内容,例如[^)]+
。 - amon