我有一个匹配这样的东西的正则表达式: asdasd [文本]; 它可以一步一步地工作,但如果有一个像:
$badinput="add[2,5,525];print['peron'];print['asd','cgfg];time;print['iudofiusdoif'];"; #time should not be matched
这是现在的代码:
verify($badinput);
sub verify
{
#returns 1 if it's ok, or the text that breaks the match
my $inp = pop;
if ($inp =~ /^(?:\w{2,6}\[(?<!\\\[).*?\](?<!\\\]);)+$/s)
{
return 1;
}else{
return 0; #should be the text that breaks the match or the char number
};
}
如果第一条指令匹配,则返回1。我该如何解决这个问题?
答案 0 :(得分:2)
一种方式。我的正则表达式与你的相似,但没有后视。
一个例子。内容script.pl
:
#! /usr/bin/perl
use warnings;
use strict;
while ( <DATA> ) {
chomp;
printf qq|%s ==> %s\n|, $_, ( m/^(\w{2,6}\[[^]]*\];)+$/ ) ? q|ok| : q|not ok|;
}
__DATA__
add[2,5,525];print['peron'];print['asd','cgfg];time;print['iudofiusdoif'];
add[2,5,525];print['peron'];print['asd','cgfg];print['iudofiusdoif'];
像以下一样运行:
perl script.pl
使用以下输出:
add[2,5,525];print['peron'];print['asd','cgfg];time;print['iudofiusdoif']; ==> not ok
add[2,5,525];print['peron'];print['asd','cgfg];print['iudofiusdoif']; ==> ok
答案 1 :(得分:2)
sub verify
{
return ($_[0] =~ m/^((?:\w{2,6}\[[^\]]*\];)+)$/)? 1 : 0;
}
测试此代码here。