我有两种模式
$good = "/(Yo)| (Me)/";
$bad = "/(an)|(nd)/";
my $thestring: "You and Me";
然后我允许String,如果一个或多个好的模式适合而没有坏的:
if (($thestring =~ $good) && ($thestring !~ $bad))
{...
不应该允许字符串“你和我”,它适用于那个例子。
但是通过向$ good添加非常多(~5000个字符)模式(例如(x1)| ... |(xn)),if语句有时允许该字符串。
我不明白为什么?是否存在某些限制?
编辑:
在原始版本中,我尝试识别名称: 通过使用模式“hari”,字符串被接受,没有它,字符串就不被接受。通过看到“und”Normaly应该禁止这种模式...
my $text_to_search ="Bettina und Frank"; #der zu pruefende Text ist jeweils ein Datensatz aus dem positiven datensatz
my $regexp_output_pos ="/(tr)|(ammi)|(hann)|(Per)|(ome)|(tel)|(ley)|(ro)|(Ya)|(ita)|(Zilv)|(Pat)|(Ale)|(llia)|(assi)|(Dell)|(ulee)|(Ur)|(ke)|(ansi)|(af)|(dh)|(leen)|(Nik)|(Anto)|(mun)|(Tild)|(vya)|(oko)|(mi)|(Emm)|(vel)|(nnon)|(olau)|(Yan)|(eld)|(land)|(tole)|(Len)|(ai)|(Sibe)|(na) /";#|(hari)/";
#my $regexp_output_neg ="/(und)|(01)|(at)|(20)/";
#my $regexp_output_pos ="/(ett)|(ran)/";
my $regexp_output_neg ="/(und)|(01)|(at)|(20)/";
if (($text_to_search =~ $regexp_output_pos) && ($text_to_search !~ $regexp_output_neg))
{
print "akzeptiert";
}
else
{
print "nicht akzeptiert"
}
答案 0 :(得分:2)
/^(?!.*neg).*pos/s
将匹配包含“pos”但不包含“neg”的字符串,因此
my @pos = qw( tr ammi hann Per ome tel ley ro Ya ita Zilv
Pat Ale llia ssi Del ulee Ur ke ansi af dh
leen Nik Anto mun Tild vya oko mi Emm vel
nnon olau Yan eld land tole Len ai Sibe na );
my @neg = qw( und 01 at 20 );
my $pos_pat = join '|', map quotemeta, @pos;
my $net_pat = join '|', map quotemeta, @neg;
/^(?!.*(?:$neg_pat)).*(?:$pos_pat)/s
但如果只删除了您添加的额外“/
”,或者使用qr,则可以使用现有模式。
my $pos_pat = "tr|ammi|hann|Per|ome|tel|ley|ro|Ya|ita|Zilv|"
. "Pat|Ale|llia|assi|Dell|ulee|Ur|ke|ansi|af|dh|"
. "leen|Nik|Anto|mun|Tild|vya|oko|mi|Emm|vel|"
. "nnon|olau|Yan|eld|land|tole|Len|ai|Sibe|na ";
my $neg_pat = "und|01|at|20";
/^(?!.*(?:$neg_pat)).*(?:$pos_pat)/s
答案 1 :(得分:2)
您的问题是,当您希望匹配"hari/"
(和"hari"
代替"/tr"
,"tr"
代替{时,您的正则表达式希望与"/und"
匹配{1}},"und"
代替"20/"
)。
此外,您似乎不会使用捕获,因此请删除它们:
"20"
顺便说一句,因为你似乎是Perl的初学者,所以不要指望perl是错误的。 perl有一些bug,但你自己的代码可能还有更多。您在这里使用的Perl功能是已被数千名其他程序员测试了20年的基本功能。
答案 2 :(得分:1)
如果=〜或!〜的RHS是一个字符串,那么它将被视为匹配模式,并且不是表达式,而是表达。
因此,如果你在其两端添加斜杠,perl实际上会在搜索空间中查找斜杠。
另一种方式是,只考虑这部分代码:
my $regexp_output_neg ="/(und)|(01)|(at)|(20)/";
if (... && ($text_to_search !~ $regexp_output_neg)) ...
if
将等效于
if (... && ($text_to_search !~
m/
\/(und)
| (01)
| (at)
| (20)\/
/x
)) ...
如果$text_to_search
碰巧是' / und'或者' 01'或者' at'或者' 20 /',即分别将前导斜杠和尾部斜杠合并到第一个和最后一个项目中,然后正则表达式匹配,!~
将为假,{{1} } expression将为false,if
会将控制传递给if
子句。
但我认为这不是你想要的,所以if条件的后半部分不会像你期望的那样对第一个和最后一个值起作用。
"但是通过向$ good添加非常多(~5000个字符)模式(例如(x1)| ... |(xn)),if语句有时允许该字符串。&#34 ;
由于上述说明,您的排除"模式可能与您认为的方式不匹配。因此,通过在"包含"中添加更多内容模式,您最终会添加与您的搜索空间匹配的内容,并且else
开始点击其if
子句。