正则表达式:如何验证是否有 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

所以 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 解决方案必须明确地匹配它们。

相关内容