所以我正在为自定义Android IME创建自动完成/拼写检查器类。这工作得很好,我使用Matcher.find()来搜索“字典”对象。我目前正在使用Google提供的15k字的单词列表。
我把这个txt文件分成几部分(A-Z),通过使用正在检查的字符串的第一个字母加快搜索过程。 txt文件从资源加载到一个hashmap中,所有这些都很有用。
然后我使用正则表达式:
String patternString = "\\b(" + word + ")";
整个功能看起来像这样:
private void findAutoCompletes(String word) {
setAlphaDictionary(Character.toUpperCase(word.charAt(0)));
ArrayList<String> autoCompleteList = new ArrayList<>();
String patternString = "\\b(" + word + ")";
Pattern pattern = Pattern.compile(patternString, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(alphaDictionary);
while(matcher.find()) {
String autoCompleteWord = pullStringFromDictionary(matcher.start());
//if currentlyCheckAgainstList does not contain the word, add it to the autoCompleteList
if (!autoCompleteWord.isEmpty()) {
if (!currentlyCheckingAgainstList.contains(autoCompleteWord)) {
currentlyCheckingAgainstList.add(autoCompleteWord);
}
}
}
}
但是,使用此工具并不总是返回应有的内容:RegexPlant我运行了一些测试。使用\ b(we)作为正则表达式,并将[are,where,website,webcast,wendy]作为要测试的字符串。这些单词取自我的词典文本文件。我错过了什么吗?我仍然是Android开发的新手,我多年没有使用Java(3~4),我一直从事Web开发和iOS开发,直到这个项目。
如果有人能指出我正确的方向,我会非常感激。
编辑:我想补充说并非总是如此。这似乎是“参差不齐”。大多数时候,我得到的结果,我希望输入“生病”返回[非法,疾病,illnois]。
答案 0 :(得分:3)
试试String patternString = "\\b(" + word + "\\w*)";
。应该管用。刚刚在regex101.com上测试过。括号内的\w*
将确保匹配整个单词,而不仅仅是搜索词。它将匹配以word
开头并且后跟零个或多个字母字符的单词。