我有一个字符串数组,我在整个应用程序中加载,它包含不同的单词。我有一个简单的if语句,看它是否包含字母或数字,但不包含单词。
我的意思是我只想要那些像AB2CD5X
这样的字词。我想要删除所有其他字词,例如Hello 3
,3 word
,any other
字词用英语单词。除了那些包含真正语法词的单词之外,是否可以只过滤alphaNumeric单词。
我知道如何检查字符串是否包含字母数字字
Pattern p = Pattern.compile("[\\p{Alnum},.']*");
也知道
if(string.contains("[a-zA-Z]+") || string.contains([0-9]+])
答案 0 :(得分:5)
您需要的是英语单词词典。然后你基本上扫描输入并检查字典中是否存在每个标记。 您可以在线查找字典条目的文本文件,例如Jazzy spellchecker。您也可以查看Dictionary text file。
下面是一个示例代码,假设您的字典是UTF-8编码的简单文本文件,每行只有一个(小写)字:
public static void main(String[] args) throws IOException {
final Set<String> dictionary = loadDictionary();
final String text = loadInput();
final List<String> output = new ArrayList<>();
// by default splits on whitespace
final Scanner scanner = new Scanner(text);
while(scanner.hasNext()) {
final String token = scanner.next().toLowerCase();
if (!dictionary.contains(token)) output.add(token);
}
System.out.println(output);
}
private static String loadInput() {
return "This is a 5gse5qs sample f5qzd fbswx test";
}
private static Set<String> loadDictionary() throws IOException {
final File dicFile = new File("path_to_your_flat_dic_file");
final Set<String> dictionaryWords = new HashSet<>();
String line;
final LineNumberReader reader = new LineNumberReader(new BufferedReader(new InputStreamReader(new FileInputStream(dicFile), "UTF-8")));
try {
while ((line = reader.readLine()) != null) dictionaryWords.add(line);
return dictionaryWords;
}
finally {
reader.close();
}
}
如果您需要更准确的结果,则需要提取stems of your words。请参阅Apache's Lucene和EnglishStemmer
答案 1 :(得分:1)
您可以使用Cambridge Dictionaries来验证人类的话语。在这种情况下,如果您发现&#34;人类有效&#34;你可以跳过它。
正如文档所说,要使用该库,您需要初始化请求处理程序和API对象:
DefaultHttpClient httpClient = new DefaultHttpClient(new ThreadSafeClientConnManager());
SkPublishAPI api = new SkPublishAPI(baseUrl + "/api/v1", accessKey, httpClient);
api.setRequestHandler(new SkPublishAPI.RequestHandler() {
public void prepareGetRequest(HttpGet request) {
System.out.println(request.getURI());
request.setHeader("Accept", "application/json");
}
});
使用&#34; api&#34;对象:
try {
System.out.println("*** Dictionaries");
JSONArray dictionaries = new JSONArray(api.getDictionaries());
System.out.println(dictionaries);
JSONObject dict = dictionaries.getJSONObject(0);
System.out.println(dict);
String dictCode = dict.getString("dictionaryCode");
System.out.println("*** Search");
System.out.println("*** Result list");
JSONObject results = new JSONObject(api.search(dictCode, "ca", 1, 1));
System.out.println(results);
System.out.println("*** Spell checking");
JSONObject spellResults = new JSONObject(api.didYouMean(dictCode, "dorg", 3));
System.out.println(spellResults);
System.out.println("*** Best matching");
JSONObject bestMatch = new JSONObject(api.searchFirst(dictCode, "ca", "html"));
System.out.println(bestMatch);
System.out.println("*** Nearby Entries");
JSONObject nearbyEntries = new JSONObject(api.getNearbyEntries(dictCode,
bestMatch.getString("entryId"), 3));
System.out.println(nearbyEntries);
} catch (Exception e) {
e.printStackTrace();
}
答案 2 :(得分:0)
Antlr 可能会对您有所帮助。 Antlr代表另一种语言识别工具
Hibernate使用ANTLR来解析其查询语言HQL(如SELECT,FROM)。
答案 3 :(得分:0)
if(string.contains("[a-zA-Z]+") || string.contains([0-9]+])
我认为这是一个很好的起点,但由于您正在寻找包含字母和数字的字符串,您可能需要:
if(string.contains("[a-zA-Z]+") && string.contains([0-9]+])
我想你可能还想检查是否有空格?对?因为你可能表明有单独的单词或某些序列,如3 word
。所以也许最后你可以使用:
if(string.contains("[a-zA-Z]+") && string.contains([0-9]+] && !string.contains(" "))
希望这有帮助
答案 4 :(得分:0)
你可以试试这个,
首先使用带有默认分隔符的StringTokenizer
对字符串进行标记,如果每个标记仅包含数字或仅包含字符,则丢弃它,剩余的将是包含数字和字符组合的单词。仅用于识别数字,只能使用正则表达式。