正規表現:子音数が奇数のギリシャ文字が13個であることを確認する方法

正規表現:子音数が奇数のギリシャ文字が13個であることを確認する方法

私が解読できない別の正規表現:(

私は前に試しましたegrep '([qwrtzpsdfghjklxcvbnmy]{1})|([qwrtzpsdfghjklxcvbnmy]{3})|([qwrtzpsdfghjklxcvbnmy]{5})|([qwrtzpsdfghjklxcvbnmy]{7})' greek.txt

しかし、これは子音が4つの単語も返しますが、なぜそうなのかわかりません。 4つのコレクションの単語が一致するのはなぜですか?

これは私のGreek.txtです。

alpha
beta
gamma
delta
epsilon
zeta
eta
theta
iota
kappa
lambda
mu
nu
xi
omicron
pi
rho
sigma
tau
upsilon
phi
chi
psi
omega

したがって、アルファは良好(lph = 3)、ベータは良好(bt = 2)、ガンマは良好(gmm = 3)、デルタは良好(dlt = 3)などです。

ベストアンサー1

[abcde]{3}setで3つの連続した文字と一致しますabcde。したがって、グループ内の1つ、3つ、5つ、または7つの連続した文字を含む行を探しています。これは、その文字の1つを含む行を見つけるのと同じです。

ギリシャ文字を見つけるための最初のステップは、パターンをラテン文字ではなくギリシャ文字と一致させるようにすることです。少なくとも13のギリシャ文字を含む行を見つけるには、「ギリシャ文字の後に別の文字が続きます」というパターンが13回表示されるかどうかを見つけます。以下は、小文字の一般的なギリシャ文字のみを探すパターンです。

<greek.txt grep -E '([αβγδεζηθικλμνξοπρςστυφχψω].*){13}'

13個の一般的なギリシャ文字とluGl以外の文字を含む行が必要な場合は、結果をフィルタリングして14個のluGlを含む行を削除してください。

<greek.txt grep -E '([αβγδεζηθικλμνξοπρςστυφχψω].*){13}' |
grep -v -E '([αβγδεζηθικλμνξοπρςστυφχψω].*){14}'

正確に13 luGlだけを含み、他の文字は含まない行が必要な場合:

<greek.txt grep -x -E '[αβγδεζηθικλμνξοπρςστυφχψω]{13}'

偶数子音が必要な場合は、「子音がないものの後に偶数が続くもの(子音の後に子音がないもの)」で構成される行を探します。奇数の場合、最後のサブパターンの別の発生を追加します。

cons="βγδζθκλμνξπρςστφχψω"
<greek.txt grep -E "^[^$cons]*([$cons][^$cons]*[$cons][^$cons]*)*[$cons][^$cons]"

Perlでは、ギリシャ文字をパターンに一致させ、\p{Greek}すべてのアルファベットの小文字をパターンに一致させることができます\p{Ll}。小文字のギリシャ文字を検索するにはを検索します(?=\p{Ll})\p{Greek}。 Unicodeセマンティクスを使用してスクリプトを実行する必要があります。最も簡単な方法は、このオプションを使用して実行することです-C() = m/REGEXP/g一致の数を計算するために使用されるPerl慣用語。

<greek.txt perl -C -l -ne 'print if (() = m/(?:(?=\p{Ll})\p{Greek})/g) == 13'

ギリシャ語のコレクションを一致させる組み込み方法がないため、質問の2番目の部分のPerlソリューションは明示的に一致する必要があります。

おすすめ記事