3

正規表現に少し慣れていないため、いくつかの機能を理解するための助けを探しています。私は現在、単語で始まり、その後にスペースがあり、その後にいくつかの可能な単語が続くデータのセットを選択しようとしています。

例 1: 基本的に、Product1 の緑、Product1 の赤、Product1 の青 (基本的には緑、赤、または青) などのデータを選択しようとしていますが、xyz Product1、Product1 の黒、Product1 の白、Product1 のガベージ 赤ではありません。

次のクエリを試しましたが、あまり成功しませんでした。

Where regexp_like(item, 'Product1 [green | red | blue]');
Where regexp_like(item, 'Product1 [green, red, blue]');
Where regexp_like(item, '^Product1 [green, red, blue]');

仮説として、同じ属性に緑と赤の単語を含むアイテムを選択するなど、「AND」を実装する方法を知っている人はいますか。

例 2: 同様の状況ですが、句読点の後の単語を照合しようとしています

Where regexp_like (job, 'Commerce [[:punct:]] .*');

このクエリを使用して、Commerce - test Commerce : abcdefg を持つジョブを選択しようとしています。

これらのクエリは、期待どおりに機能しておらず、その理由がよくわかりません。これらの正規表現の構造を誤解していると思います。

どんな助け/説明も大歓迎です!

4

1 に答える 1

2

まず、次のことを試してください。

WHERE REGEXP_LIKE(ITEM, '^Product1.*(green|red|blue)')

また

WHERE REGEXP_LIKE(ITEM, '^Product1 (green|red|blue)')

また

WHERE REGEXP_LIKE(ITEM, '^Product1 +(green|red|blue)')

の後に何を期待するかに応じてProduct1- 最初のケースでは任意の種類の 0 個以上の文字が許可され、2 番目のケースでは の後に単一のスペースが必要でProduct1あり、3 番目のケースでは の後に 1 つ以上の空白が必要Product1です。

2番目の場所で正確にどこに行くのかわかりません。「Commerce」で始まり、その後にスペースが続き、その後に句読点、別のスペース、そして何かが続く文字列が本当に必要な場合は、試してください

WHERE REGEXP_LIKE(JOB, '^Commerce [:punct:] .*');

句読点の代わりに「:」または「-」を探している場合は、

WHERE REGEXP_LIKE(JOB, '^Commerce [:-] .*');

私は正規表現の専門家ではありませんが、いくつかの説明を提供しようとします。

  • ^次の要素が文字列の先頭にある必要があります。したがって、最初のケースで^Product1は、「'Product1' は文字列の先頭にある必要があります」という意味になります。
  • 正規表現では、式をグループ化するために括弧が使用されるため、最初のケース(green|red|blue)では一緒にグループ化されます。
  • |は論理 OR であるため、(green|red|blue)「'green' または 'red' または 'blue' のいずれかでなければならない」ことを意味します。
  • 角括弧は文字クラスに使用されます。:punct: や :space: などの事前定義されたクラスを使用するか、 のように独自のクラスを作成できます[:-]。正規表現の解釈中、角括弧文字クラスは、長さに関係なく、一致する文字列内の 1 文字を表します。したがって、正規表現^Commerce [:-] .*では、文字クラス[:-]は「コロンまたはダッシュを探す」ことを意味します。クラス内の複数の文字が次々に出現することを期待していることを示したい場合は、クラスの後に繰り返し演算子 (*または+) の 1 つを使用します。これ[abc]*により、すべての に一致しますabcabcabc

また、正規表現ではすべての文字が何かを意味するため、正規表現を読みやすくするために空白を使用することはできません。空白は、式が解釈されるときに検索されるものになるためです。

共有してお楽しみください。


編集

以前の質問に気づきませんでしANDた。複数の式を AND で結合する簡単な方法は、それらを 1 つずつ並べることです。(green|red|blue) の後にスペースが続き、その後に (green|red|blue) が続く単純な式は次のようになります。

WHERE REGEXP_LIKE(ITEM, '^Product1 (green|red|blue) (green|red|blue)')

色の間に複数のスペースが許可される可能性がある場合

WHERE REGEXP_LIKE(ITEM, '^Product1 (green|red|blue) +(green|red|blue)')

使用することができます。

抵抗は無駄です。

于 2012-08-15T11:01:54.467 に答える