これは私が見るものです:
'100=product(getProduct_abc) in (Xyz)'
Group1 match = '100'
Group2 match = '='
Group3 match = 'product(getProduct_abc) in (Xyz)'
'product(getProduct_abc) in (Xyz)'
^
Fails here on Group1 match because parenthesis are not included in this group
この状況を修正するには、文字列内でグループ 1、2、3 の一致が最後に出現するように強制します。
同等の Group1 一致を修正/書き換えてグループを分離すると、それらを再結合して、可能な限り最後の一致を強制することができます。
rxP1 = '(?:-?[\w()]+\ *)';
rxP2 = '(?:!=|<=|>=|=|<|>| not in | in | not like | like )';
rxP3 = '(?:.*?)';
rxAll = /(?:$rxP1$rxP2$rxP3)*($rxP1)($rxP2)($rxP3)$/;
パールでは:
use strict;
use warnings;
my @samples = (
'product(getProduct_abc) in (Xyz1)',
'100=product(getProduct_abc) in (Xyz2)',
'100 like = != not like >product(getProduct_abc) in (Xyz3)',
);
my $rxP1 = '(?:-?[\w()]+\ *)';
my $rxP2 = '(?:!=|<=|>=|=|<|>| not in | in | not like | like )';
my $rxP3 = '(?:.*?)';
for (@samples)
{
if ( /(?:$rxP1$rxP2$rxP3)*($rxP1)($rxP2)($rxP3)$/ ) {
print "\n1 = '$1'\n";
print "2 = '$2'\n";
print "3 = '$3'\n";
}
}
出力:
1 = 'product(getProduct_abc)'
2 = ' in '
3 = '(Xyz1)'
1 = 'product(getProduct_abc)'
2 = ' in '
3 = '(Xyz2)'
1 = 'product(getProduct_abc)'
2 = ' in '
3 = '(Xyz3)'