Regex 如何提取perl正则表达式匹配/(a | b)中的哪个a或b/
我试图使用Perl正则表达式匹配不同的逻辑表达式,例如:$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]=~/\
$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;