我想查找给定正则表达式是否是较大正则表达式的子集。 例如,给定一个更大的正则表达式((a *)(b(a *))),我想找到像(aab。*)或(a。*)这样的正则表达式是否匹配它。我正在开发一个程序,我需要找到给定长度的所有子字符串,可以从给定的正则表达式形成。
$count=0;
$len=0;
sub match{
my $c=$_[1];
my $str=$_[0];
my $reg=$_[2];
#if($str.".*"!~/^$reg$/){
# return;
#}
if($c==$len){
if($str=~/^reg$/){
$count++;
}
return;
}
my $t=$str.'a';
&match($t,$c+1,$reg);
my $t=$str.'b';
&match($str.'b',$c+1,$reg);
}
for(<>){
@arr=split(/\s/,$_);
$len=$arr[1];
&match('a',1,$arr[0]);
&match('b',1,$arr[0]);
print $count;
}
所以我认为我会使用递归来启动给定长度的字符串,当字符串大小达到所需长度时,我会将它与原始exp进行比较。这适用于小的子字符串,但是对于较大的子字符串会遇到堆栈溢出。所以我想在生成字符串本身的一部分时,我会检查表达式给出reg exp。但那没用。对于上面给出的reg exp((a *)(b(a *)))如果我们将它与部分字符串(aa)进行比较,它将失败,因为reg exp不匹配。因此,为了使它工作,我需要通过在每个部分子搅拌后面添加。*来比较两个正则表达式。我试图在网上找到答案,但没有成功。
我尝试了以下代码,但很自然地失败了。任何人都可以建议其他方法。
if("a.*"=~/((a*)(b(a*)))/){
print match;
}
但是这里第一部分被认为是一个实际的字符串。你能帮我解决一下如何转换代码,这样我就可以比较(a。*)作为正则表达式而不是字符串。
答案 0 :(得分:1)
我认为一种方法是找到匹配字符串的长度,如果可以的话。例如,如果匹配(aab)到(aac),则可以获得匹配停止的长度。
现在比较匹配停止的位置,如果它等于你的字符串的长度,而不是等同于str(。*)的正则表达式。我读过它可以用其他语言完成,但我不确定perl。