3

次の式を使用しています。

/^[alopinme]{5}$/

この正規表現は、角かっこで囲まれた文字を含む一連の単語から単語を取得します。

さて、フェッチされた単語に別の文字セットからの文字をあと1つだけ含めることができる必要があるため、このような式にいくつかの機能を追加する必要があります。セットAの文字で形成された単語を取得し、 (存在する場合は)セットBの文字をもう1つ含めることができるとしましょう。

正規表現を完成させる方法を推測しようとしていますが、正しい方法が見つかりません。

誰かが私を助けることができますか?

ありがとう。

編集:

ここに例を投稿します:

SELECT sin_acentos FROM Finder.palabras_esp WHERE sin_acentos REGEXP '^[tehsolm]{5}$'

この表現は私に次のような言葉を選んでいます:兜、蛾、家など。

しかし、私は文字のセットBを追加し、そのようなセットから1つだけを含むことができる単語を取得する必要があります。別の文字セット[xzk]があるとしましょう。そうすれば、式はより多くの単語を取得できますが、セットBから1文字を選択する可能性があります。

結果には、mozes、hoxes、tozesなどの単語が含まれる可能性があります。このような単語を確認すると、すべての単語のほとんどの文字がセットAからのものであるが、セットBからは1つだけであることがわかります。

4

2 に答える 2

2

あなたが探している単語はすべて 5 文字の長さなので、トリックを実行するやや醜い表現を考えることができ[alopinme]ます[xyz]。それから式

/^([alopinmexyz][alopinme]{4}|[alopinme][alopinmexyz][alopinme]{3}|[alopinme]{2}[alopinmexyz][alopinme]{2}|[alopinme]{3}[alopinmexyz][alopinme]|[alopinme]{4}[alopinmexyz])$/

探している構造の 5 文字の単語を許可する必要があります。

一般に、何かを数える必要があると、正規表現が判読できなくなります。このような問題は、この点を説明するのに適しています。/^[alopinmexyz]{5}$/式を記述し、コードに余分なステップを追加し[xyz]て、テキストに 1 回しか表示されないことを確認する方がはるかに簡単です。正規表現を使用して追加のチェックを行うこともできます。

/^[^xyz]*[xyz]?[^xyz]*$/

SQL の結果は次のようになります。

SELECT sin_acentos
FROM Finder.palabras_esp
WHERE sin_acentos REGEXP '^[tehsolmxyz]{5}$'      -- Length == 5, all from tehsolm+xyz
  AND sin_acentos REGEXP '^[^xyz]*[xyz]?[^xyz]*$' -- No more than one character from xyz
于 2012-08-12T11:42:37.790 に答える
2

他の文字のいずれかが 1 回だけ出現する必要がある場合は、次を使用できます。

^(?=.{5}$)[alopinme]*(?:[XYZ][alopinme]*)?$
  • (?=.{5}$)- 一致する前であっても、文字列の長さが 5 文字であることを確認します。(これは MySql では機能しない可能性があります)
  • [alopinme]*- Aのキャラクター
  • (?:[XYZ][alopinme]*)?- オプション - B から 1 文字、A からさらにいくつか。

作業例: http://rubular.com/r/aw6l561Int

または、最大 3 回まで使用する場合は、次のようにします。

^(?=.{5}$)[alopinme]*(?:[XYZ][alopinme]*){0,3}$
于 2012-08-12T11:51:45.460 に答える