Luc*_*man 4 regular-expression
另一个我似乎无法破解的正则表达式:(
我试过 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
Run Code Online (Sandbox Code Playgroud)
所以 alpha 没问题( lph = 3 ),beta 不是( bt = 2 ),gamma 没问题(gmm = 3),delta 没问题(dlt = 3 )等等。
[abcde]{3}
匹配集合中的三个连续字符abcde
。因此,您要在该组中查找包含 1、3、5 或 7 个连续字符的行,这相当于查找具有这些字符之一的行。
要查找希腊字母,第一步是让模式匹配希腊字母,而不是拉丁字母。要查找包含至少 13 个希腊字母的行,请查找模式“一个希腊字母后跟一些其他内容”的 13 次出现。这是一个仅查找小写未修饰希腊字母的模式:
<greek.txt grep -E '([?????????????????????????].*){13}'
Run Code Online (Sandbox Code Playgroud)
如果您想要包含正好包含 13 个小写原始希腊字母的行(加上一些不是 luGl 的其他内容),请过滤结果以消除包含 14 个 luGl 的行。
<greek.txt grep -E '([?????????????????????????].*){13}' |
grep -v -E '([?????????????????????????].*){14}'
Run Code Online (Sandbox Code Playgroud)
如果您想要包含 13 个 luGl 而没有其他字符的行:
<greek.txt grep -x -E '[?????????????????????????]{13}'
Run Code Online (Sandbox Code Playgroud)
现在,如果您想要偶数个辅音,请查找由“不包含任何辅音的内容后跟偶数个(辅音后跟不包含任何辅音的内容)”组成的行。对于奇数,添加另一个出现的最后一个子模式。
cons="???????????????????"
<greek.txt grep -E "^[^$cons]*([$cons][^$cons]*[$cons][^$cons]*)*[$cons][^$cons]"
Run Code Online (Sandbox Code Playgroud)
在 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'
Run Code Online (Sandbox Code Playgroud)
没有内置的方法来匹配希腊元音,因此问题第二部分的 Perl 解决方案必须明确匹配它们。
归档时间: |
|
查看次数: |
2476 次 |
最近记录: |