【问题标题】:Storing words from a .txt file into a String array将 .txt 文件中的单词存储到字符串数组中
【发布时间】:2026-01-15 23:05:01
【问题描述】:

我正在查看某人之前提出的this 问题的答案,我发现它们非常有帮助。但是,我对highlighted 的答案有疑问,但我不确定我是否应该在那里问,因为它是一个 6 岁的线程。

我的问题是关于答案中给出的这个 sn-p 代码:

private static boolean isAWord(String token)
{
    //check if the token is a word
}

你将如何检查令牌是否是一个单词?你会.contains("\\s+") 字符串并检查它们之间是否包含字符吗?但是当你遇到一个段落怎么办?我不知道该怎么做。

编辑:我想我应该详细说明一下。通常,您会认为单词会被 " " 包围,但是,例如,如果文件包含连字符(也被空格包围),您会希望 isAWord() 方法返回 false。如何验证某些内容实际上是单词而不是标点符号?

【问题讨论】:

  • 嗯,这取决于我认为的“单词”的定义。也许token.matches("\\w+")如果这个词应该只包含字母token.matches("[A-Za-z]+")但这不会匹配变音符号和其他非ASCII字母

标签: java arrays string


【解决方案1】:

由于问题不完全清楚,我做了两种方法。第一个方法包含字母只是遍历整个字符串,如果它有任何数字/符号,则返回 false。这应该足以确定标记是否是单词(如果您不介意该单词是否存在于字典中)。

public static boolean consistsOfLetters(String string) {
        for(int i=0; i<string.length(); i++) {
            if(string.charAt(i) == '.' && (i+1) == string.length() && string.length() != 1) break; // if last char of string is ., it is still word
            if((string.toLowerCase().charAt(i) < 'a' || string.toLowerCase().charAt(i) > 'z')) return false; 
        }  // toLowerCase is used to avoid having to compare it to A and Z
        return true;
    }
        

第二种方法帮助我们根据“ ”字符划分原始字符串(例如一个潜在词的句子)。完成后,我们检查那里的每个元素并检查它是否是一个单词。如果不是单词,则返回 false 并跳过其余部分。如果一切正常,则返回 true。

    public static boolean isThisAWord(String string) {
        String[] array = string.split(" ");
        for(int i = 0; i < array.length; i++) {
            if(consistsOfLetters(array[i]) == false) return false;
        }
        return true;
    }

此外,这可能不适用于英语,因为英语中有诸如“不要”之类的撇号,因此需要进一步修改。

【讨论】:

    【解决方案2】:

    Java 中的 Scanner 默认使用 WHITESPACE_PATTERN 拆分字符串,因此拆分像 "He's my friend" 这样的字符串会产生像 ["He's", "my", "friend"] 这样的数组。 如果这足够了,只需删除该 if 子句并且不要使用该方法。 如果您想使用"He","is" 而不是"He's",您需要一种不同的方法。

    简而言之:该方法的工作原理类似于验证检查 -> 如果给定的令牌不应该出现在结果中,则返回 false,否则返回 true。

    【讨论】:

      【解决方案3】:
      return token.matches("[\\pL\\pM]+('(s|nt))?");
      

      matches 要求匹配整个字符串。

      这需要字母 \pL 和零长度组合变音符号 \pM(重音符号)。 如果您考虑使用doesn'tlet's 一个 术语(例如用于翻译目的),则可能是英文撇号。 您也可以考虑使用连字符。

      有几个单引号和破折号。

      Path path = Paths.get("..../x.txt");
      Charset charset = Charset.defaultCharset();
      String content = Files.readString(path, charset)
      Pattern wordPattern = Pattern.compile("[\\pL\\pM]+");
      Matcher m = wordPattern.matcher(content);
      while (m.find()) {
          String word = m.group(); ...
      }
      

      【讨论】: