将正则表达式与perl中的其他正则表达式匹配

时间:2013-12-22 04:41:39

标签: regex perl

我想查找给定正则表达式是否是较大正则表达式的子集。 例如,给定一个更大的正则表达式((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。*)作为正则表达式而不是字符串。

1 个答案:

答案 0 :(得分:1)

我认为一种方法是找到匹配字符串的长度,如果可以的话。例如,如果匹配(aab)到(aac),则可以获得匹配停止的长度。

现在比较匹配停止的位置,如果它等于你的字符串的长度,而不是等同于str(。*)的正则表达式。我读过它可以用其他语言完成,但我不确定perl。