解码逻辑的搜索模式

时间:2020-02-24 20:53:41

标签: regex perl search logic

在确定属性是否能够与我正在定义的项目相关联时,我需要从我引用的数据库中解码逻辑。数据库使用标准逻辑流程和重要性顺序。我需要能够确定从数据库中提取的字符串中的嵌套条件语句。例如:

$val = "(red && (blue || yellow)) && black";

我将从数据库中提取的字符串类似于:

$pull = "red.yellow.black";

我将$pull上的.分开并将值存储在数组中,然后验证每个值都在从$val字符串生成的数组中。我在确定如何解压缩嵌套逻辑的最佳方法时遇到麻烦。最初,我考虑只使用正则表达式,然后删除已评估的逻辑部分,如下所示:

($eval) = $val =~ /.*\((.*)?\)/; $val =~ s/(.*)\((.*)?\)(.*)/$1 $2/;

如果我在while ($val =~ /\(/)循环中执行此操作,则可能会将提取的逻辑堆栈到数组中,并评估每个元素中的逻辑表达式,以确定我所评估的项目的每个条件是否为真,但是有一些问题我的regexp错误,导致序列失败。 ?并没有我想的那么懒,显然...

my $val = "(red && (blue || yellow)) && black";
my $pull = "red.yellow.black";
my @stack = ();

until ($val !~ /\(/) {
    my ($eval) = $val =~ /.*\((.*)?\)/;
    push(@stack, $eval);
    print "$eval\n";
    $val =~ s/(.+)\((.*)?\)(.*)/$1 $2/;
    print "$val\n";
}

如果我只是在perl shell中运行序列,并提供一些调试信息,我会得到:

[bin]$ perl -e 'my $val = "((red && (blue || yellow) && black)"; my $pull = "red.yellow.black"; my @stack = (); until ($val !~ /\(/) { my ($eval) = $val =~ /.*\((.+)?\).?/; push(@stack, $eval); print "EVAL: $eval\n";$pause = <STDIN>;$val =~ s/(.*)\((.*)?\)(.*)/$1 $2/;print "VAL: $val\n"; }'
EVAL: blue || yellow) && black

VAL: ((red &&  blue || yellow) && black
EVAL: red &&  blue || yellow

VAL: ( red &&  blue || yellow
EVAL:

任何对我做错事的投入将不胜感激,任何对效率的改进将不胜感激! TIA

更新:好的,所以我只是把整个事情都这样哑了下来。我失去了一些操作顺序,但是如果我分别评估每个语句,则只要其中一个条件被破坏,我都会进行处理,并能够对信息进行相应的处理。我将在下面扩展的代码。这只会返回表达式的各个组成部分。我不喜欢将所有括号都连接到第一个元素中,但是我想它仍然可以从根本上起作用。

my $val = "(red && (blue || yellow)) && black";
$val =~ s/\s+//g;

my @chars = ();
my @ops = ();

while ($val) {
    my ($char) = $val =~ /(.)/;
    $val =~ s/.//;
    push @chars, $char;
}

my $index = 0;
foreach my $char (@chars) {
    if ($char =~ /\(/) {
        $index++;
    } elsif ($char =~ /\)/) {
        $index--
    }
    #assign the character to the index.
    $ops[$index] .= $char;
}

s/[()]//g for @ops;
print " @ops\n";

输出:

[/bin]$ perl decode_logic.pl
 &&black red&& blue||yellow

0 个答案:

没有答案
相关问题