选择至少包含两个不同字母的单词

时间:2012-12-06 00:13:59

标签: java

我正在使用此代码

Matcher m2 = Pattern.compile("\\b[ABE]+\\b").matcher(key);

仅从HashMap获取包含字母A,B或E

的键

我虽然对AAAAAA或EEEEE这样的词感兴趣但我需要至少有两个不同字母的单词(最好的情况是三个)。

有没有办法修改正则表达式?任何人都可以提供这方面的见解吗?

3 个答案:

答案 0 :(得分:1)

替换除字母以外的所有内容,制作一组结果,测试Set的大小。

public static void main (String args[])
{
    String alphabet = "ABC";
    String totest = "BBA";

    if (args.length == 2)
    {
        alphabet = args[0];
        totest = args[1];
    }
    String cleared = totest.replaceAll ("[^" + alphabet + "]", "");
    char[] ca = cleared.toCharArray ();
    Set <Character> unique = new HashSet <Character> ();
    for (char c: ca)
        unique.add (c);
    System.out.println ("Result: " + (unique.size () > 1));
}

示例实现

答案 1 :(得分:0)

您可以使用更复杂的正则表达式来执行此操作,例如

(.*A.*[BE].*|.*[BE].*A.*)|(.*B.*[AE].*|.*[AE].*B.*)|(.*E.*[BA].*|.*[BA].*E.*)

但是进行某种替换可能会更容易理解,例如使用''创建一个一次替换一个字母的循环,并且每次检查新字符串的大小 - 如果它发生变化两次字符串的大小,然后你有两个你想要的字符。 编辑:实际上,如果您在之前知道运行之前所需的字符集进行检查,那么NullUserException在其评论中将其正确 - indexOf或{{ 1}}会比这更有效,也可能更具可读性。

请注意,如果您在编译时未知所需的字符集(或至少在运行时进行字符串检查),则第二个选项更可取 - 如果您正在寻找任何字符,只需替换contains循环中第一个字符的出现次数 - 它循环的次数就是你得到的不同字符的数量。

答案 2 :(得分:-1)

明确标记所需字母的重复, 它看起来像这样:

  \b[ABE]{1,3}\b

它符合AAE,EEE,AEE但不符合AAAA,AAEE