3

我正在尝试用Java编写一个正则表达式,它将匹配一个长度为n的单词,其中至少有x个元音。

到目前为止,我想出了以下内容:

// match words that are length 10 and have at least 2 vowels in them
(?=\w{10})(?:[^aeiou\W]*[aeiuo]){2}\w+

这似乎有效,但也匹配长度大于 10 的单词,即:

荒野 - 比赛

挥发 - 匹配

声纹 - 匹配(这应该是唯一的匹配)

我希望它可以强制执行 length=10 约束。我怀疑这可能与我在字符串长度中添加字母(元音)这一事实有关,但我不确定。任何帮助/指导将不胜感激。

4

3 回答 3

3

使用单词边界 ,\b来防止匹配在单词中途发生:

\b(?=\w{10}\b)(?:[^aeiou\W]*[aeiuo]){2,}[^aeiou\W]*\b

这将匹配:

荒野声纹挥发

于 2012-11-17T17:05:59.067 回答
2

您可以通过使用简单的前瞻(作为 java 字符串)大大简化:

"(?i)\\b(?=([^aeiou ]*[aeiou]){2,})[a-z]{10}\\b"

请注意,所有其他答案都\w用于字母,但\w包括下划线字符,它不是字母。

(?i)打开不区分大小写。

于 2012-11-17T17:25:20.343 回答
0

试试这个... (?<=\b|\p{Punct})(?:(?i)(?:aeiou{2,})|(?:az&&[^aeiou]{3,})) (?<=\w{10})

针对似乎有效的样本数据对此进行了测试。在我的例子中,我已经考虑了标点符号。

于 2015-03-02T19:25:42.997 回答