子音で区切られた同じ母音を持つ単語を見つける

子音で区切られた同じ母音を持つ単語を見つける

テキスト内の母音 - 子音 - 同母音パターンを持つ単語を見つけるためにgrepパラメータを探しています。

例:

オーロ

ルオofo
ピアツーピアパールコットンピアツーピア

ありがとうございます。

答え1

コレクションの形成は言語と地域によって異なります。

認識された英語のコレクションの場合(ここでは小文字のバージョンのみが考慮されます):

vowels=aeiou
consonants=bcdfghjklmnpqrstvwxyz

grep "\([$vowels]\)[$consonants]\1"

$vowelsあなたの言語に適応することができます$consonants

ただし、Unicodeを使用すると少し複雑になる可能性があります。

たとえば、ラテン語のアルファベットに限定しても、フランス語では夏の言葉と一致します。ただし、Unicodeでは、éは単一の文字(U + 00E9)で書くことも、それに続くé分解形式で書くこともできます。e結合する鋭いアクセント( ◌́U+0301)。

それ以外に、このような文字もありますが、これは2文字を書くもう一つの方法ですfi

この問題を解決する1つの方法は、テキストを次に変換することです。標準化された形式e⃞確認する前に、マルチ文字形式に展開してください。次に、基本文字と発音区別記号または他の結合文字(!=などの完全な文字素クラスタ)のシーケンスを考慮する必要がありますé̂

perl -MUnicode::Normalize -C -lne '
  print if NFKD($_) =~ /((?=[aeiouy])\X)(?=[bcdfghjklmnpqrstvwxz])\X\1(?!\p{mark})/'

(NKFDは標準化された形式です。互換性分析ée、+◌́および+になること)。fi

\Xperlゲームで拡張文字列クラスタ(?=[aeiouy])\X基本文字が小文字のラテン語の集合(soeまたは...)のé文字素クラスタの場合も同様です。これはyコレクションとして含まれます(ラテンアルファベットを使用する多くの言語ではコレクションと見なされるため)。

したがって、私たちは母音クラスター、子音クラスター、およびで取り込まれた最初のクラスターと一致します\1。ただし、次の文字がまだそのクラスタの一部ではないことを確認する必要があります。それ以外の場合は、同様のものと一致しますeté。したがって、次の文字に対応する属性がないことを確認するには、否定予測演算子を使用しますmark

したがって、次の入力の場合:

fini
été
tacheté

次を返します。

fini
été

関連情報