正则表达式匹配元音按顺序a-e-i-o-u

时间:2014-08-02 01:32:26

标签: regex grep

我正在尝试匹配vowels按顺序排列的模式,不应该重复,可以用non-vowels分隔。

目前我只是使用ae对其进行测试。但是,我没有得到我期望的输出。

grep 'a[^aeiou]*e[^aeiou]*'

因此,例如aeabebabbbbbbeb都应匹配。

但是,aeeb不应该匹配。

凭我的正则表达式,为什么这匹配?

我原以为e中的第一个aeeb会与e中的a[^aeiou]*e[^aeiou]*匹配,其余的正则表达式会失败吗?

感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

a[^aeiou]*e[^aeiou]*ae中的aeeb匹配。

如果你想确保第aeeb行不匹配,你必须锚定正则表达式:

^a[^aeiou]*e[^aeiou]*$

答案 1 :(得分:1)

使用字符串^的开头和字符串$锚点的结尾。

#!/bin/sh
STRING=$( cat <<EOF
ae
abeb
abbbbbbeb
aeeb
EOF
)
echo "$STRING" | grep '^a[^aeiou]*e[^aeiou]*$'
## ae
## abeb
## abbbbbbeb

答案 2 :(得分:0)

我对此已经太晚了,但对于后来遇到这种情况的人来说,你可以简单地使用:

grep -P "a.*e.*i.*o.*u" myfile.txt

用简单的英语,这是一个&#39; a&#39;其次是0或更多的任何其他字母,然后是&#39; e&#39;,然后是0或更多的任何其他字母,依此类推。

如果您正在搜索/ usr / shares / dict /中的字典,那么这将与其他工作代码片段相同。但是,值得一提的是,这与整个单词不符。它只会匹配第一个&#39; a&#39;到第一个&#39; u&#39; (假设&#39; u&#39;是匹配元音序列中的最后一个字母),省略前导和尾随字符。例如,在&#39; facetious&#39;只有&#39; etiou&#39;将匹配。如果要匹配整个单词,可以将正则表达式修改为:

grep -P ".*a.*e.*i.*o.*u.*" myfile.txt

请注意&#39;。*&#39;在开始和结束。

希望这有帮助。

答案 3 :(得分:0)

你也应该在前面加上一个非元音括号表达式,以便考虑以你以外的字符开头的单词,因为你最后允许它:

egrep '^[^aeiou]*a[^aeiou]*e[^aeiou]$'