如何在java中使用正则表达式否定元音条件
我正在尝试为字符串构造正则表达式,该字符串应具有以下条件:如何在java中使用正则表达式否定元音条件,java,regex,Java,Regex,我正在尝试为字符串构造正则表达式,该字符串应具有以下条件: 它必须至少包含一个元音 它不能包含三个连续的元音或三个连续的辅音 除“ee”或“oo”外,它不能包含同一字母的两个连续出现 我无法为第2和第3种情况构造正则表达式 e、 g: 鲍尔接受,, 应用程序-不接受, Miiiixer-不接受, hedding-不接受, 喂食-接受 提前谢谢 编辑: 我的代码: Pattern ptn = Pattern.compile("((.*[A-Za-z0-9]*)(.*[aeiou|AEIOU]+)(
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]
说明:
修复与字符串开头的匹配^
检查在字符串中当前位置之后的任何点都找不到3个连续元音。(因为这是紧跟在^this后面的,所以会检查整个字符串)。它也不会使光标前进(?!.[aeiou]{3})
- 非元音的测试也类似。如果您的regexp风格支持集减法,那么这可以以更漂亮的方式完成。但我认为Java不能做到这一点
检查除e或o以外的字符是否存在单个字符捕获组,该字符捕获组后面是否有自身的副本。除e和o外,没有其他字符重复两次(?!*([^eo])\1)
在字符串中的某个点查找元音*[aeiou]
它也是一个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])
:不包含3个连续元音(?!.[aeiouy]{3})
:不包含3个连续的辅音(?!.[a-z&[^aeiouy]]{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,则需要转义\。这一个非常好用!如果您能简要介绍一下您使用过的每个正则表达式组,那将非常有帮助。谢谢