所以我使用 jflex 做了一个练习,这是关于计算包含 3 个以上元音的输入文本文件中的单词数量。我最终做的是为单词定义一个标记,然后创建一个 java 函数来接收此文本作为输入,并检查每个字符。如果是元音,我将计数器相加,然后检查它是否大于 3,如果是,我将单词数量的计数器相加。
我想知道的是,是否有一个正则表达式可以匹配一个超过 3 个元音的单词。我认为这将是一个更干净的解决方案。提前谢谢。
令 牌
Letra = [a-zA-Z]
Palabra = {Letra}+
很简单。如果要检查单词是否至少包含 3 个元音,请使用此选项。
(?i)(?:[a-z]*[aeiou]){3}[a-z]*
您只关心它至少包含 3 个元音,因此其余部分可以是任何字母字符。上面的正则表达式可以在String.matches
和Matcher
循环中工作,因为有效单词(包含至少 3 个元音)不能是无效单词(包含少于 3 个元音)的子字符串。
毫无疑问,但对于辅音,您可以使用字符类交集,这是 Java 正则表达式[a-z&&[^aeiou]]
的独特功能。因此,如果您想检查正好 3 个元音(对于 String.matches
):
(?i)(?:[a-z&&[^aeiou]]*[aeiou]){3}[a-z&&[^aeiou]]*
如果您在匹配器循环中使用它:
(?i)(?<![a-z])(?:[a-z&&[^aeiou]]*[aeiou]){3}[a-z&&[^aeiou]]*(?![a-z])
请注意,我必须使用环顾四周来确保匹配的字符串(正好 3 个元音)不是无效字符串的一部分(当它有超过 3 个元音时可能)。
由于您自己编写了一个 Java 方法,因此可以按如下方式完成此操作:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class VowelChecker {
private static final Pattern vowelRegex = Pattern.compile("[aeiouAEIOU]");
public static void main(String[] args) {
System.out.println(checkVowelCount("aeiou", 3));
System.out.println(checkVowelCount("AEIWW", 3));
System.out.println(checkVowelCount("HeLlO", 3));
}
private static boolean checkVowelCount(String str, int threshold) {
Matcher matcher = vowelRegex.matcher(str);
int count = 0;
while (matcher.find()) {
if (++count > threshold) {
return true;
}
}
return false;
}
}
在这里threshold
定义了您要查找的元音数(因为您要查找大于 3,因此在 main
方法中为 3)。输出如下:
true
false
false
希望这有帮助!
谢谢
EG
我最终使用了我想出的这个正则表达式。如果有人有更好的,请随时发布
Cons = [bcdBCDfghFGHjklmnJKLMNpqrstPQRSTvwxyzVWXYZ]
Vocal = [aeiouAEIOU]
Match = {Cons}*{Vocal}{Cons}*{Vocal}{Cons}*{Vocal}{Cons}*{Vocal}({Cons}*{Vocal}*|{Vocal}*{Cons}*) | {Vocal}{Cons}*{Vocal}{Cons}*{Vocal}{Cons}*{Vocal}({Cons}*{Vocal}*|{Vocal}*{Cons}*)