0

次の構文を実行する単語のセットをフェッチするために正規表現を使用しています。

SELECT * FROM words WHERE word REGEXP '^[dcqaahii]{5}$'

私の第一印象は、正規表現に含まれているよりも多くの文字が使用されていることに気付くまでは良かったという感覚を私に与えました。

問題は、角かっこ内の文字で形成できるすべての単語(つまり、5文字)を取得したいので、2つの「a」がある場合、結果の単語に「a」、1つの「a」、または2つの「a」ですが、それ以上はありません。

これを回避するには、正規表現に何を追加する必要がありますか?

前もって感謝します。

4

3 に答える 3

1

他の人が示唆しているように、最初にすべての候補を取得して後処理する方がおそらく良いでしょう:

SELECT * FROM words WHERE word REGEXP '^[dcqahi]{5}$'

ただし、複数の REGEXP を実行することを妨げるものは何もありません。次の汚れた表現を使用して、文字「a」の 0、1、または 2 つの出現を選択できます。

'^[^a]*a?[^a]*a?[^a]*$'

したがって、最初にプレフィルターを実行してから、追加の REGEXP 要件を AND で結合します。

SELECT * FROM words
  WHERE word REGEXP '^[dcqahi]{5}$'
    AND word REGEXP '^[^a]*a?[^a]*a?[^a]*$'
    AND word REGEXP '^[^i]*i?[^i]*i?[^i]*$'

[編集]後付けとして、非母音についても 0 または 1 回の出現に制限したいと推測しました。だったら、続ければいいのに…。

    AND word REGEXP '^[^d]*d?[^d]*$'
    AND word REGEXP '^[^c]*c?[^c]*$'
    AND word REGEXP '^[^q]*q?[^q]*$'
    AND word REGEXP '^[^h]*h?[^h]*$'

うん。

于 2012-07-25T23:48:06.787 に答える
0

私が考えることができる唯一の解決策は、上記のSQLを使用して、最初にフィルター処理されたデータセットを取得する必要がありますが、それをループして、そのようなことを行うのにより適したサーバー側コード(PHPなど)でさらにフィルター処理することです.論理。

于 2012-07-25T23:30:25.280 に答える
0

正規表現では、角括弧 [] は、許可された文字のリストのような単なる文字クラスです。したがって、括弧内に同じ文字を 2 回指定することは冗長です。

たとえば、パターン[sed]は に一致sedし、は許可された文字の一部であるseedためです。e中かっこ {} で後で文字数を指定することは、文字クラスによって以前に許可された文字の合計数にすぎません。

したがって、パターン[sed]{3}は一致しますが、一致sedしませんseed

単語の有効性をテストするためのロジックを SQL からプログラムに移すことをお勧めします。

于 2012-07-25T23:31:38.027 に答える