Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何提取perl正则表达式匹配/(a | b)中的哪个a或b/_Regex_Perl - Fatal编程技术网

Regex 如何提取perl正则表达式匹配/(a | b)中的哪个a或b/

Regex 如何提取perl正则表达式匹配/(a | b)中的哪个a或b/,regex,perl,Regex,Perl,我试图使用Perl正则表达式匹配不同的逻辑表达式,例如:$a和$b,下面是我的代码: $input =~ /^(.*)\s(and|or|==|<|>|>=|<=)\s(.*)$/ { $arg1=$1; $arg2=$3; $opt=$2; } 我想得到or表达式中匹配的精确值。我不想对所有的案例逐一进行匹配,并对操作符进行硬编码 有人知道如何解决这个问题吗?这段代码适合我: $input = '$ARGV[0]=~/\

我试图使用Perl正则表达式匹配不同的逻辑表达式,例如:$a和$b,下面是我的代码:

$input =~ /^(.*)\s(and|or|==|<|>|>=|<=)\s(.*)$/ {
        $arg1=$1;
        $arg2=$3;
        $opt=$2;
}
我想得到or表达式中匹配的精确值。我不想对所有的案例逐一进行匹配,并对操作符进行硬编码


有人知道如何解决这个问题吗?

这段代码适合我:

$input = '$ARGV[0]=~/\w{4}/ and $num_arg==1';
if ($input=~/^(.*)\s(and|or|==|<|>|>=|<=)\s(.*)$/) {
        $arg1=$1;
        $arg2=$3;
        $opt=$2;
        print "$arg1\n$arg2\n$opt\n";
}

您需要一个能够揭示逻辑表达式结构的小型解析器。这是因为在一个术语中可能有另一个表达式。您可以使用perl来使用包测试语法

作为第一次尝试,我将写:

<expression> ::= <term> | <expression> <binary-op> <term>
<term> ::= <factor> <binary-op> <factor> | <unary-op><factor>
<factor> ::= <id>
<binary-op> ::= (and|or|==|<|>|>=|<=)
<unary-op> ::= (not | ! )
有一点是肯定的,您不能仅使用正则表达式来完整描述逻辑表达式的语法,它总是缺少一些有效的大小写

用于验证的Perl代码


美元输入的典型值是什么?请将其添加到您的问题中。您的代码不是有效的Perl 5代码。perl在以下位置报告语法错误。。。第1行。请发布正确编译的代码。我不太确定$a和$b如何映射到您发布的$arg1和$arg2的值,以及两者与问题标题的关系如何?请提供您提供代码的$input的实际值,以及您期望的$arg1和$arg2的实际值。还请注意,根据您的具体操作,正则表达式可能不是最佳选择。请尝试将。*更改为。*?正确解析数值表达式似乎需要表达式解析器,而不是正则表达式。正则表达式适用于词法分析,例如用于分离原子符号,但当一个符号可能根据上下文具有不同含义时,正则表达式很快就会崩溃
<expression> ::= <term> | <expression> <binary-op> <term>
<term> ::= <factor> <binary-op> <factor> | <unary-op><factor>
<factor> ::= <id>
<binary-op> ::= (and|or|==|<|>|>=|<=)
<unary-op> ::= (not | ! )
use Modern::Perl;
use Marpa::R2;

my $dsl = <<'END_OF_DSL';
:default ::= action => [name,values]
lexeme default = latm => 1

Expression       ::= Term
                     | Expression BinaryOP Term
Term             ::= Factor BinaryOP Factor
                     | UnaryOP Factor
Factor           ::= ID
ID                ~ [\w]+
BinaryOP          ~ 'and' | 'or' | '==' | '<' | '>' | '>=' | '<='
UnaryOP           ~ 'not' | '!' 
:discard          ~ whitespace
whitespace        ~ [\s]+
END_OF_DSL

# your input
my $input       = 'a and b or !c';

# your parser
my $grammar = Marpa::R2::Scanless::G->new( { source => \$dsl } );

# process input
my $recce = Marpa::R2::Scanless::R->new(
    { grammar => $grammar, semantics_package => 'My_Actions' } );
my $length_read = $recce->read( \$input );

die "Read ended after $length_read of ", length $input, " characters"
  if $length_read != length $input;