我正在尝试为字符串构造一个正则表达式,该字符串应具有以下条件:
我无法为第二和第三个条件构建正则表达式。
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;
答案 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]]
:a
和z
之间的任何字母,但aeiouy
(?!.*([a-z&&[^eo]])\1)
:不包含2个连续字母,e
和o
除外
[a-z&&[^eo]]
:a
和z
之间的任何字母,但eo
请参阅http://www.regular-expressions.info/charclassintersect.html。
答案 1 :(得分:0)
这应该适用于英语,假设“' y'是一个非元音;
^(?!.*[aeiou]{3})(?!.*[bcdfghjklmnpqrstvwxyz]{3})(?!.*([^eo])\1).*[aeiou]
说明:
^
将匹配项修复为字符串的开头。(?!.*[aeiou]{3})
检查在字符串中当前位置之后的任何位置都找不到3个连续的元音。 (因为这是在^检查整个字符串之后的不可避免的)。它也不会使光标前进。(?!.*([^eo])\1)
检查单个字符捕获组是否出现e或o以外的字符,后面跟着自身的副本。 IE浏览器。 e和o以外的任何字符都不会重复两次。.*[aeiou]
在字符串中的某个位置查找元音。此正则表达式还假定已设置不区分大小写的标志。我认为这是java的默认设置,但我可能错了。
它也是一个正则表达式,可以在符合条件的字符串中找到匹配项。它不会与整个字符串匹配。 - 如果需要,请将.*$
添加到正则表达式的末尾。
答案 2 :(得分:0)
如果我的预感是正确的,你打算说 "连续三次出现同一个字母" (查看你的例子)那么你可以只需说" e
和o
可能不会发生三次,其他一切可能都不会发生两次&#34; < / em>,像这样:
^(?=.*[aeiouy].*)(?!.*([eo])\1\1.*)(?!.*([a-df-np-z])\2.*).*$
Debuggex Demo,关键是发生三次的信件也发生两次。