0

私は正規表現を持っています

(\\w+[ ]*|-\\w+[ ]*)(!=|<=|>=|=|<|>| not in | in | not like | like )(.*)

これには、コンマで区切られた 3 つのセクションがあります。

これを次のようなものと照合しようとすると

product(getProduct_abc) in (Xyz)

正規表現と一致しません。

でも合わせようとすると

100=product(getProduct_abc) in (Xyz)

それは完全に一致します。

正規表現の何が問題になっていますか?

4

2 に答える 2

0

正規表現自体に問題はありません。指定された文字列と一致しません。

正規表現の参考になり、基本を学ぶ必要があります。1つはhttp://www.regular-expressions.info/です。それは初心者としてのあなたへの良い参考になるかもしれませんし、そうでないかもしれません。(私は彼のRegexBuddyツールを使用して正規表現をテストしています。)

式の大まかな内訳は次のとおりです。

  • 3つのキャプチャグループがあり、それぞれが独自の括弧のペアで囲まれています。(括弧は、他の多くの文字と同様に、正規表現では特別な意味を持つため、どちらの方向の括弧にも一致させるには、それをエスケープする必要があります。指定された正規表現では、これは行われません。)
  • 最初のキャプチャグループでは、一致する可能性のある2つの選択肢があります。彼らです:
    • 1つ以上の「単語」文字の後に0個以上のスペースが続く、または
    • ダッシュ、それに続く1つ以上の「単語」文字、それに続く0個以上のスペース
  • 2番目のキャプチャグループには、10個の一致する可能性があります。リストされた演算子記号(周囲のスペースなし)、またはリストされたテキスト演算子(周囲のスペースあり)
  • 3番目のキャプチャグループでは、0個以上の文字が一致します。

(Xyz)の文字列'product(getProduct_abc)'は、' in'演算子の前に単なる「単語」文字以外のものがあるため、一致しません。括弧は「単語」文字とは見なされないため、一致は失敗します。

2番目の文字列( '100 = product(getProduct_abc)in(Xyz)')は、2番目のキャプチャグループの一致演算子としてequals('=')を使用するため、一致します。'100'はすべての「単語」文字の文字列です。 、および「=」の後のすべてが「任意の文字」の部分と一致するため、一致は成功します。文字列の終わりの処理方法によっては、文字列の最後にある場合でも、その文字列と一致しない言語があることに注意してください。

最初の文字列が一致することになっている場合は、ビジネスユーザーに確認する必要があります。たぶん彼らも正規表現の初心者で、うまくいかないものをあなたに与えました。;-)

于 2011-01-14T05:40:53.500 に答える
0

これは私が見るものです:

'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)'
于 2011-01-14T06:12:52.627 に答える