另一个我似乎无法破解的正则表达式:(
我尝试过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
所以 alpha 可以( lph = 3 ), beta 不行( bt = 2) , gamma 可以( gmm = 3 ), delta 可以( dlt = 3 ),等等。
答案1
[abcde]{3}
匹配集合中的三个连续字符abcde
。因此,您要在该组中查找包含一个、三个、五个或七个连续字符的行,这相当于查找包含其中一个字符的行。
要查找希腊字母,第一步是让模式匹配希腊字母,而不是拉丁字母。要查找至少包含 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'
没有内置的方法来匹配希腊元音,因此问题第二部分的 Perl 解决方案必须明确地匹配它们。