如何在java中使用Regex消除元音条件

时间:2015-01-05 10:51:44

标签: java regex

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

  1. 必须至少包含一个元音。
  2. 它不能包含三个连续的元音或三个连续的辅音。
  3. 除了'ee'或'oo'之外,它不能包含两个相同字母的连续出现。
  4. 我无法为第二和第三个条件构建正则表达式。

    e.g: 凉亭 - 接受, appple - 不被接受, miiixer - 不接受, 对冲 - 不接受, 喂养 - 接受

    提前致谢!

    编辑:

    我的代码:

    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;
    

3 个答案:

答案 0 :(得分:2)

以下内容应符合您的需求:

(?=.*[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("feeding".matches(regex));

打印:

true
false
false
false
true

说明:

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

请参阅http://www.regular-expressions.info/charclassintersect.html

答案 1 :(得分:0)

这应该适用于英语,假设“' y'是一个非元音;

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

说明:

  • ^将匹配项修复为字符串的开头。
  • (?!.*[aeiou]{3})检查在字符串中当前位置之后的任何位置都找不到3个连续的元音。 (因为这是在^检查整个字符串之后的不可避免的)。它也不会使光标前进。
  • 非元音类似地进行测试。如果你的正则表达式支持set减法,这可以以更漂亮的方式完成。但我认为Java不会这样做。
  • (?!.*([^eo])\1)检查单个字符捕获组是否出现e或o以外的字符,后面跟着自身的副本。 IE浏览器。 e和o以外的任何字符都不会重复两次。
  • .*[aeiou]在字符串中的某个位置查找元音。

此正则表达式还假定已设置不区分大小写的标志。我认为这是java的默认设置,但我可能错了。

它也是一个正则表达式,可以在符合条件的字符串中找到匹配项。它不会与整个字符串匹配。 - 如果需要,请将.*$添加到正则表达式的末尾。

答案 2 :(得分:0)

如果我的预感是正确的,你打算说 &#34;连续三次出现同一个字母&#34; (查看你的例子)那么你可以只需说&#34; eo可能不会发生三次,其他一切可能都不会发生两次&#34; < / em>,像这样:

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

Regular expression visualization

Debuggex Demo,关键是发生三次的信件发生两次。