刚接触正则表达式,遇到个难题————“找到一段英文文章中所有包含且仅包含3个元音的单词”,求助该怎么编写正确的正则表达式?
下面是我自己写的规则
\b\w*[aeiou]\w*[aeiou]\w*[aeiou]\w*\b
问题是会匹配到3个以上元音的单词。
还请大神能给予解答。多谢!
刚接触正则表达式,遇到个难题————“找到一段英文文章中所有包含且仅包含3个元音的单词”,求助该怎么编写正确的正则表达式?
下面是我自己写的规则
\b\w*[aeiou]\w*[aeiou]\w*[aeiou]\w*\b
问题是会匹配到3个以上元音的单词。
还请大神能给予解答。多谢!
一次性解决不了。。我想了另一个途径,可以先用你之前的方法把包含三个及三个以上的单词匹配出来:
.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
去掉了的小写字母。
2 回答10.5k 阅读✓ 已解决
3 回答3.1k 阅读✓ 已解决
5 回答2.1k 阅读
\b[aeiou]{3}\b
没有区分大小写的。
之前写错了,应该是用
\b
来做界定符的