(x 以外) および y(!x&y) と一致させる正規表現

(x 以外) および y(!x&y) と一致させる正規表現

パズルを含むデスクトップの毎日のカレンダーを受け取りました。パズルの1つは、文字の代わりに記号を使用する引用符を解読することです。私は長い単語を見つけるためにいくつかの正規表現を使い、返された単語を使ってより小さな単語を解決します。パズルでは、白い背景記号はコレクション(「y」を含む)で、色付きの背景記号は子音です。

以下では任意の文字を使用します。太字は子音を表し、一般的な文字は母音を表し、イタリック体は文字が指示に記載されていることを示します。

第二酸素QQ第二

上記の例は正規表現を使用して「ハッピー」と解釈されます(「e」はすでにパズルに提供されています)。

 egrep -i '^[bcdfghjklmnpqrstvwxz][aiouy][bcdfghjklmnpqrstvwxz]{2}[aiouy]$' words

結果はたくさんありますが、次のように論理的に指定すると正規表現をより良くすることができるようです。

  1. 文字1は子音です。
  2. Char 2 はコレクションですが、指示に示されている「e」ではありません。
  3. 3番と4番の文字は同じ子音ですが、1番の文字とは異なります。
  4. 文字5はコレクションですが、文字2とは異なります。

別の例は

酸素 金利 ワットはいD酸素N

grepステートメントをどこで使用しましたか?

egrep -i '^([aiouy])[bcdfghjklmnpqrstvwxz]e[bcdfghjklmnpqrstvwxz][aiouy][bcdfghjklmnpqrstvwxz]\1n$' words

検索は論理的に次のように定義されます。

  1. Char 1 はコレクションであり、同じ文字が単語の後半に表示されるため、キャプチャグループです。
  2. Char 2は子音です。
  3. 与えられた文字3は「e」です。
  4. 4文字は子音です。
  5. Char 5はコレクションです。
  6. 6番目の文字は子音です。
  7. Char 7とChar 1は同じコレクションです。
  8. 与えられた文字8は「n」です。

幸いなことに、grepステートメントは「アメリカ」という言葉を返しました(秘密のテキストは映画大使でした)。 Char 4はchar 2とは異なり、子音であり、char 5はchar 1と​​は異なり、母音であることを正規表現で指定できるようにしたいです。

このパターンマッチングを正規表現で聞くことはできますか?(x|y)宣言文字の構文が「である」ことがわかります。X「または」ワイ'しかし、指定する構文(存在する場合)がわかりません。(!x) & y

ベストアンサー1

否定的な予測機能と組み合わせてPerl正規表現を使用できます。

$ grep -Pi '^([aeiouy])([bcdfghjklmnpqrstvwxz])e(?!\2)([bcdfghjklmnpqrstvwxz])(?!\1)([aeiouy])(?!\2)(?!\3)([bcdfghjklmnpqrstvwxz])\1n$' /usr/share/dict/words
American
american
everymen

拡張:

$ perl -lnE '
    BEGIN { $vowel = qr/[aeiouy]/i; $consonant = qr/[bcdfghjklmnpqrstvwxz]/i }
    say if /^ ($vowel)                  # vowel
              ($consonant)              # consonant
              e                         # literal
              (?!\2)($consonant)        # different consonant
              (?!\1)($vowel)            # different vowel
              (?!\2)(?!\3)($consonant)  # 3rd different consonant
              \1                        # first vowel again
              n                         # literal
            $/xi
' /usr/share/dict/words
American
american
everymen

BOQQEの例は次のとおりです。

grep -Pi '^([bcdfghjklmnpqrstvwxz])([aiouy])(?!\1)([bcdfghjklmnpqrstvwxz])\3(?!\2)([aiouy])$' /usr/share/dict/words

私の辞書は779個の結果を返しました(444個の大文字と小文字の区別)。

おすすめ記事