【正则】找到一段英文文章中所有包含且仅包含3个元音的单词

刚接触正则表达式,遇到个难题————“找到一段英文文章中所有包含且仅包含3个元音的单词”,求助该怎么编写正确的正则表达式?
下面是我自己写的规则

\b\w*[aeiou]\w*[aeiou]\w*[aeiou]\w*\b

问题是会匹配到3个以上元音的单词。
还请大神能给予解答。多谢!

阅读 5.8k
5 个回答

\b[aeiou]{3}\b
没有区分大小写的。
之前写错了,应该是用\b来做界定符的

一次性解决不了。。我想了另一个途径,可以先用你之前的方法把包含三个及三个以上的单词匹配出来:

.match(/\b\w*[aeiou]\w*[aeiou]\w*[aeiou][\w]*\b/g)

转化成字符串,后去掉 “,”

.toString().replace(/,/g," ")

最后在结合我写的:

.match(/\b[^aeiou\s]*[aeiou][^aeiou\s]*[aeiou][^aeiou\s]*[aeiou][^aeiou\s]*\b/g)
/\b[bcdfghjklmnpqrstvwxyz]*[aeiou][bcdfghjklmnpqrstvwxyz]*[aeiou][bcdfghjklmnpqrstvwxyz]*[aeiou][bcdfghjklmnpqrstvwxyz]*\b/gi

/\b(?=[a-z]{3,}\b)[^aeiou]*[aeiou][^aeiou]*[aeiou][^aeiou]*[aeiou][^aeiou]*?\b/gi

另外,希望提问时给出样例文本,方便回答者测试

如果不限定在一个表达式中完成,可以先匹配单词,再过滤出含 3 个元音的,用 Python 实现为:

import re

text = "Regular expressions use the backslash character ('\') to indicate special forms or to allow special characters to be used without invoking their special meaning. "

ws = re.findall(r'\w+', text)

xs = filter(lambda w: len(re.findall(r'[aeiou]', w)) == 3, ws)

print xs
# output: ['Regular', 'character', 'special', 'special', 'characters', 'without', 'invoking', 'special', 'meaning']
/\b([b-df-hj-np-tv-z]*[aeiou]){3}[b-df-hj-np-tv-z]*\b/i

为了方便点,我只匹配小写字母了,然后用忽略大小写去匹配大写字母。
实际上,和你一开始写的思路类似,但是你忘了\w中也是包含了aeiou的,而且\w还包含了0-9_。我这个匹配中[b-df-hj-np-tv-z]就是把aeiou去掉了的小写字母。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏