0

我正在使用此代码

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

仅从 aHashMap中获取包含字母 A、B 或 E 的密钥

虽然我对 AAAAAA 或 EEEEE 等单词不感兴趣,但我需要至少包含两个不同字母的单词(最好是三个)。

有没有办法修改正则表达式?任何人都可以对此提供见解吗?

4

3 回答 3

1

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

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));
}

示例实现

于 2012-12-06T00:20:25.073 回答
0

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

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

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

请注意,如果您的所需字符集在编译时未知(或至少在运行时进行预字符串检查),则第二个选项更可取 - 如果您正在寻找任何字符,只需替换所有出现的第一个字符循环while(str.length > 0)- 它通过循环的次数是您拥有的不同字符的数量。

于 2012-12-06T00:37:57.037 回答
-1

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

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

它匹配 AAE、EEE、AEE 但不匹配 AAAA、AAEE

于 2012-12-06T00:27:07.403 回答