0

所以我使用 jflex 做了一个练习,它是关于从包含超过 3 个元音的输入文本文件中计算单词的数量。我最终要做的是为单词定义一个标记,然后创建一个接收此文本作为输入的 java 函数,并检查每个字符。如果它是元音,我将计数器加起来,然后检查它是否大于 3,如果是,我将单词数量的计数器加起来。

我想知道的是,如果有一个正则表达式可以匹配一个超过 3 个元音的单词。我认为这将是一个更清洁的解决方案。提前致谢。

代币

   Letra = [a-zA-Z]
   Palabra = {Letra}+
4

3 回答 3

1

很简单。如果您想检查一个单词是否包含至少 3 个元音,请使用此选项。

(?i)(?:[a-z]*[aeiou]){3}[a-z]*

你只关心它包含至少 3 个元音,所以其余的可以是任何字母字符。上面的正则表达式可以在String.matchesMatcher循环中工作,因为有效单词(至少包含 3 个元音)不能是无效单词(包含少于 3 个元音)的子字符串。


不可能,但是对于辅音,您可以使用字符类交集,这是 Java regex 的独特功能[a-z&&[^aeiou]]。因此,如果您想准确检查3 个元音(对于String.matches):

(?i)(?:[a-z&&[^aeiou]]*[aeiou]){3}[a-z&&[^aeiou]]*

如果您在 Matcher 循环中使用它:

(?i)(?<![a-z])(?:[a-z&&[^aeiou]]*[aeiou]){3}[a-z&&[^aeiou]]*(?![a-z])

请注意,我必须使用环视来确保匹配的字符串(正好 3 个元音)不是无效字符串的一部分(当它有超过 3 个元音时可能)。

于 2013-02-01T06:43:42.383 回答
0

由于您自己编写了一个 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

于 2013-02-01T05:18:33.267 回答
0

我最终使用了我想出的这个正则表达式。如果有人有更好的随时发布

     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}*)
于 2013-02-01T06:33:40.400 回答