如何在java中使用正则表达式否定元音条件

如何在java中使用正则表达式否定元音条件,java,regex,Java,Regex,我正在尝试为字符串构造正则表达式,该字符串应具有以下条件: 它必须至少包含一个元音 它不能包含三个连续的元音或三个连续的辅音 除“ee”或“oo”外,它不能包含同一字母的两个连续出现 我无法为第2和第3种情况构造正则表达式 e、 g: 鲍尔接受,, 应用程序-不接受, Miiiixer-不接受, hedding-不接受, 喂食-接受 提前谢谢 编辑: 我的代码: Pattern ptn = Pattern.compile("((.*[A-Za-z0-9]*)(.*[aeiou|AEIOU]+)(

我正在尝试为字符串构造正则表达式,该字符串应具有以下条件:

  • 它必须至少包含一个元音
  • 它不能包含三个连续的元音或三个连续的辅音
  • 除“ee”或“oo”外,它不能包含同一字母的两个连续出现
  • 我无法为第2和第3种情况构造正则表达式

    e、 g: 鲍尔接受,, 应用程序-不接受, Miiiixer-不接受, hedding-不接受, 喂食-接受

    提前谢谢

    编辑:

    我的代码:

    Pattern ptn = Pattern.compile("((.*[A-Za-z0-9]*)(.*[aeiou|AEIOU]+)(.*[@#$%]).*)(.*[^a]{3}.*)");
    Matcher mtch = ptn.matcher("zoggax");
    
    if (mtch.find()) {
            return true;
        }
    else
        return false;
    

    假设“y”是非元音字母,那么这应该适用于英语

    ^(?!.*[aeiou]{3})(?!.*[bcdfghjklmnpqrstvwxyz]{3})(?!.*([^eo])\1).*[aeiou]
    
    说明:

    • ^
      修复与字符串开头的匹配
    • (?!.[aeiou]{3})
      检查在字符串中当前位置之后的任何点都找不到3个连续元音。(因为这是紧跟在^this后面的,所以会检查整个字符串)。它也不会使光标前进
    • 非元音的测试也类似。如果您的regexp风格支持集减法,那么这可以以更漂亮的方式完成。但我认为Java不能做到这一点
    • (?!*([^eo])\1)
      检查除e或o以外的字符是否存在单个字符捕获组,该字符捕获组后面是否有自身的副本。除e和o外,没有其他字符重复两次
    • *[aeiou]
      在字符串中的某个点查找元音
    此regexp还假定设置了不区分大小写的标志。我认为这是java的默认设置,但我可能错了


    它也是一个regexp,可以在满足条件的字符串中找到匹配项。它不必匹配整个字符串。-如果需要,请将
    *$
    添加到regexp的末尾。

    以下选项应适合您的需要:

    (?=.[aeiouy])(?!.[aeiouy]{3})(?!.[a-z&[^aeiouy]]{3})(?!.([a-z&&[^eo]])\\1)*
    
    在Java中:

    String regex=“(?=.[aeiouy])(?!.[aeiouy]{3})(?!.[a-z&[^aeiouy]]{3})(?!.[a-z&[^eo]])\\1.*”;
    System.out.println(“bower.matches(regex));
    System.out.println(“appple.matches(regex));
    System.out.println(“miiixer.matches(regex));
    System.out.println(“hedding.matches(regex));
    System.out.println(“feed.matches(regex));
    
    印刷品:

    true
    假的
    假的
    假的
    真的
    
    说明:

    • (?=.[aeiouy])
      :至少包含一个元音
    • (?!.[aeiouy]{3})
      :不包含3个连续元音
    • (?!.[a-z&[^aeiouy]]{3})
      :不包含3个连续的辅音
      • [a-z&&[^aeiouy]]
        :介于
        a
        z
        之间的任何字母,但
        aeiouy
    • (?!*([a-z&&[^eo]])\1
      :不包含两个连续的字母,除了
      e
      o
      • [a-z&&[^eo]
        :介于
        a
        z
        之间的任何字母,但
        eo

    参见。

    如果我的直觉是正确的,你的意思是说“同一个字母连续出现三次”(看看你的例子),那么你可以简单地说“
    e
    o
    可能不会出现三次,其他所有事情可能不会出现两次”,就像这样:

    ^(?=.*[aeiouy].*)(?!.*([eo])\1\1.*)(?!.*([a-df-np-z])\2.*).*$
    


    ,关键是一个字母出现三次也会出现两次。

    您能展示一下您迄今为止的尝试吗?我们可以增加它来帮助你我的建议。。不要使用正则表达式..:P.正则表达式应该用于匹配条件,如x前面有3个W,然后是2个y,然后是1个或更多的9’,如果你能创建表示规则的自动机,那么你就可以构造正则表达式。它不能包含三个连续的辅音,这似乎很奇怪。很多话都可以。例如“Construct”。@khelwood更不用说三个连续的元音了。拟声词以4结尾。同样假设字符串是小写的。很好的正则表达式,但不知何故“feed”并没有通过这个测试。@khelwood不完全是,我假设设置了不区分大小写的标志。将更新答案以包含。@Sid,“馈送”与此模式匹配。@TheNerd?它拒绝了您提供的示例,这应该是因为zoggax中的双g和wiinq中的双i。如果以字符串形式输入regexp,则需要转义\。这一个非常好用!如果您能简要介绍一下您使用过的每个正则表达式组,那将非常有帮助。谢谢