【问题标题】:How to negate a vowel condition using Regex in java如何在java中使用正则表达式否定元音条件
【发布时间】:2015-01-05 10:51:43
【问题描述】:

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

  1. 它必须至少包含一个元音。
  2. 它不能包含三个连续的元音或三个连续的辅音。
  3. 它不能包含两个连续出现的相同字母,“ee”或“oo”除外。

我无法为第二个和第三个条件构建正则表达式。

例如: 凉亭 - 接受, 苹果 - 不接受, 混合器 - 不接受, 对冲 - 不接受, 喂食 - 接受

提前致谢!

已编辑:

我的代码:

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;

【问题讨论】:

  • 你能展示一下你到目前为止所做的尝试吗?我们可以对其进行扩充以帮助您。
  • 我的建议..不要使用正则表达式..:P。正则表达式应该用于 匹配 条件,例如 x 前面有 3 个 W,然后是 2 个 y,然后是 1 个或多个 9
  • 如果您可以创建代表您的规则的自动机,那么您可以构建正则表达式。
  • 似乎很奇怪,它不能包含三个连续的辅音。很多话都行。例如“构造”。
  • @khelwood 更不用说三个连续的元音了。象声词以 4 结尾。

标签: java regex


【解决方案1】:

以下应该适合您的需要:

(?=.*[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

【讨论】:

  • 这个完美!如果您能简要介绍您使用过的每个正则表达式组,将会很有帮助。谢谢!
【解决方案2】:

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

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

解释:

  • ^ 将匹配固定到字符串的开头。
  • (?!.*[aeiou]{3}) 检查是否在字符串中当前位置之后的任何点都找不到 3 个连续的元音。 (因为这是在 ^ 之后立即检查整个字符串)。它也不会使光标前进。
  • 对非元音进行类似测试。如果您的正则表达式风格支持集合减法,这可以以更漂亮的方式完成。但我认为 Java 不会这样做。
  • (?!.*([^eo])\1) 检查是否存在单个字符捕获组、e 或 o 以外的字符,然后是其自身的副本。 IE。除了 e 和 o 之外,没有任何字符重复两次。
  • .*[aeiou] 在字符串中的某个位置查找元音。

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

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

【讨论】:

  • 也是假设字符串是小写的。
  • 很棒的正则表达式,但不知何故“喂食”没有通过这个测试。
  • @khelwood 不完全是,我假设设置了不区分大小写的标志。将更新答案以包括在内。
  • @Sid, "feeding" 确实符合这个模式。
  • @TheNerd ?它拒绝您提供的示例,这是因为 zoggax 中的双 g 和 wiinq 中的双 i 。如果您将正则表达式作为字符串输入,则需要转义 \.
【解决方案3】:

如果我的预感是正确的,你的意思是说 “三个连续出现的相同字母”(看看你的例子)那么你可以简单地说 eo 可能不会出现 三次,其他所有事情都可能不会出现 两次,如下所示:

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

Debuggex Demo,关键是一个字母出现三次出现两次。

【讨论】:

    猜你喜欢
    • 2011-09-05
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多