Java字符串 - 如何判断一个字符串是否只包含数字和字符而不包含单词?

4
我有一个字符串数组,在我的应用程序中加载,它包含不同的单词。我有一个简单的if语句来查看它是否包含字母或数字,而不是单词。
我的意思是,我只想要像AB2CD5X这样的单词,我想删除所有其他单词,例如Hello 33 wordany other是英文中的单词。是否可以仅过滤字母数字单词,除了包含真正语法词的单词之外。
我知道如何检查字符串是否包含字母数字单词。
Pattern p = Pattern.compile("[\\p{Alnum},.']*");

also know

 if(string.contains("[a-zA-Z]+") || string.contains([0-9]+])

2
简短回答:使用正则表达式。 - jrd1
https://dev59.com/pFjUa4cB1Zd3GeqPPTlV - Macrosoft-Dev
3
你如何区分一系列字母和一个单词? - Hirak
对于真正的语法和完整的英语语言,您需要广泛的实现。只需检查用户输入的字母数字并将它们添加到键值对样式中,消除其他内容。对于字母数字,请使用正则表达式。 - Akash kumar
为了识别英语单词,您可以使用“英语词典单词列表”(http://stackoverflow.com/questions/824422/can-i-get-an-english-dictionary-word-list-somewhere)和在该列表中进行(快速)搜索。 - Fil
显示剩余4条评论
5个回答

5
你需要的是一本英语单词词典。然后,你基本上可以扫描输入并检查每个标记是否存在于你的词典中。 你可以在网上找到词典条目的文本文件,比如 Jazzy spellchecker。你也可以检查字典文本文件。 这是一个示例代码,假设你的词典是一个简单的文本文件,采用 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();
    }
}

如果您需要更准确的结果,需要提取您单词的词干。请参阅Apache's LuceneEnglishStemmer


1
你可以使用剑桥词典来验证人类单词。在这种情况下,如果您发现一个“人类有效”的单词,您可以跳过它。
正如文档所述,要使用该库,您需要初始化请求处理程序和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");
    }
});

使用 "api" 对象:
      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();
      }

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(" "))

希望这能帮到您。


0
你可以尝试以下方法:
首先使用默认分隔符使用 StringTokenizer 对字符串进行分词,对于每个标记,如果它只包含数字或只包含字符,则将其丢弃,剩下的将是同时包含数字和字符的单词。为了识别只有数字或只有字符,您可以使用正则表达式。

0

Antlr 可能会对你有所帮助。 Antlr 代表 ANother Tool for Language Recognition(另一种语言识别工具)

Hibernate 使用 ANTLR 解析其查询语言 HQL(例如 SELECT、FROM)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接