正则表达式匹配顺序

4

我的问题很简单,假设我想匹配一个单词中的元音字母,但我想按照它们出现的特定顺序进行匹配,如a、e、i、o、u。我该如何做呢?

2个回答

10

所以你需要查找一个 a,然后跟随一些字符,接着是 e,再跟随一些字符,然后是 i,再跟随一些字符,然后是 o,再跟随一些字符,最后是不跟随 u,且最后必须是 u

换句话说,首先是 a,然后是不是 e 的一些东西,再是 e。接着是不是 i 的一些东西,再是 i。然后是不是 o 的一些东西,再是 o。最后是不是 u 的一些东西,且最后必须是 u

用正则表达式表示为: a[^e]*e[^i]*i[^o]*o[^u]*u

(虽然你可以使用 .*?,但为什么不更精确地定义你的意思呢?)


1
你在那里忘记了一些 *,但我认为任何人都能理解。 - Seth Robertson
4
稍微修改一下: a[^eiou]*e[^aiou]*i[^aeou]*o[^aeiu]u(这是一个正则表达式,匹配以 a 开头、u 结尾,中间有任意数量的不包含 e、i、o、u 的字符,并在其中穿插着 e、i、o、u 但没有重复的) - Alvin
所以我做了!添加了缺失的 *s。 - VoteyDisciple
@Alvin提出了一个很好的观点。我假设只要元音字母按照顺序存在,任何字符串都是有效的。因此,uAuEuIuOuUu是有效的,因为我可以发现(并已将其大写)A-E-I-O-U序列,尽管有大量额外的U。如果您需要仅允许按照该顺序出现元音字母,则需要像Alvin建议的那样操作。 - VoteyDisciple
@Votey,你的正则表达式无法匹配uAuEuluOuUu,但它可以匹配“sacrilegious”,这证明了你的观点。 - Steffan Harris
使用 /i 就可以了。(-: 大写字母只是为了易读性,与小写字母实际上没有区别。但没错——"sacrilegious" 也会匹配。 - VoteyDisciple

0
我会选择:
a.*?e.*?i.*?o.*?u

但是这个问题与Alvin对Votley答案的评论中指出的问题相同。这是由于问题没有足够的说明。没有说明优先级是什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接