从通配符生成新单词

时间:2015-04-23 19:14:01

标签: java wildcard

我试图用外卡生成一个单词并检查并查看该单词是否存储在字典数据库中。像“appl *”应该返回apply或apple。然而,当我有2张外卡时会出现问题。 “app **”会像appaa,appbb..appzz这样的词汇而不是苹果。第二个if条件仅适用于不包含通配符“*”

的常规字符串
 public static boolean printWords(String s) {
    String tempString, tempChar;
    if (s.contains("*")) {

        for (char c = 'a'; c <= 'z'; c++) {

            tempChar = Character.toString(c);
            tempString = s.replace("*", tempChar);

            if (myDictionary.containsKey(tempString) == true) {
                System.out.println(tempString);
            } 
        } 
    }
    if (myDictionary.containsKey(s) == true) {
        System.out.println(s);
        return true;
    } else {
        return false;
    }
}

3 个答案:

答案 0 :(得分:1)

您只使用单个for循环字符,并用该字符替换*的所有实例。 See the API for String.replace here。因此,您获得Appaa,Appbb等字符串并不奇怪。

如果你想真正使用Regex表达式,那么你不应该做任何String.replace或包含等等。请参阅Anubian的答案,了解如何处理你的问题。

如果您将此视为字符串练习并且不想使用正则表达式,那么最简单的方法就是执行您实际尝试的操作(尝试每个字母的所有字母组合) wildcard)是递归地做的。如果字符串中没有任何外卡,请检查它是否为单词,如果是,则打印。如果存在通配符,请尝试使用字符替换该通配符,并在创建的字符串上递归调用该函数。

public static void printWords(String s){
    int firstAsterisk = s.indexOf("*");
    if(firstAsterisk == -1){ // doesn't contain asterisk
        if (myDictionary.containsKey(s))
            System.out.println(s);
        return;
    }

    for(char c = 'a', c <= 'z', c++){
        String s2 = s.subString(0, firstAsterisk) + c + s.subString(firstAsterisk + 1);
        printWords(s2);
    }
}

基本原因依赖于the indexOf function - 当indexOf返回-1时,意味着给定的子字符串(在我们的例子中是&#34; *&#34;)不会出现在字符串中 - 因此有没有更多的外卡可供替换。

子字符串部分基本上重新创建原始字符串,第一个星号替换为字符。假设s = "abcd**ef"c='z',我们知道firstAsterisk = 4(字符串是0索引,索引4有第一个&#34; *&#34;)。因此,

String s2 = s.subString(0, firstAsterisk) + c + s.subString(firstAsterisk + 1);
          = "abcd" + 'z' + "*ef"
          = "abcdz*ef"

答案 1 :(得分:0)

*字符是正则表达式通配符,因此您可以将输入字符串视为正则表达式:

for (String word : myDictionary) {
    if (word.matches(s)) {
        System.out.println(word);
    }
}

让图书馆为你做繁重的工作;)

答案 2 :(得分:0)

根据您的方法,您必须检查所有可能的组合。 更好的方法是从输入字符串中生成正则表达式,因此将所有<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>替换为*

您可以循环遍历.并检查每个条目是否与正则表达式匹配。

这样的事情:

myDirectory

如果您的输入字符串已包含Set<String> dict = new HashSet<String>(); dict.add("apple"); String word = "app**"; Pattern pattern = Pattern.compile(word.replace('*', '.')); for (String entry : dict) { if (pattern.matcher(entry).matches()) { System.out.println("matches: " + entry); } } ,则必须小心,而不必使用.来转义它们。 (对于其他特殊正则表达式字符也一样。)

另见 http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.htmlhttp://docs.oracle.com/javase/6/docs/api/java/util/regex/Matcher.html