从每一行得到第一个字?

时间:2016-03-20 15:16:44

标签: java regex string

很难从每一行获得第一个单词。有什么想法为什么输出空白文件?

该程序将以下文本作为输入:

abecedism   word created from the initials of words in a phrase
ablaut  variation in root vowel of words to change meaning
acronym word formed from initial letters of another word
acrophonic  using a symbol for the initial sound of a thing
acroteleutic    phrase or words at the end of a psalm
adversative word or phrase expressing opposition

目的是让结果看起来像这样:

abecedism   
ablaut  
acronym 
acrophonic  
acroteleutic    
adversative 

以下是目前的代码:

public static void main(String args[]) {
    String fileNameOutput = "OutputFile.txt";
    String fileName = "InputWords.txt";
    Charset cs = Charset.defaultCharset();
    try (BufferedReader bReader = Files.newBufferedReader(Paths.get(fileName), cs)) {
        PrintWriter outputStream = new PrintWriter(fileNameOutput);
        int lineNum = 0;
        String line = null;
        while ((line = bReader.readLine()) != null) {
            lineNum++;
            if (line.split(" ").length > 1) continue;
            outputStream.println(line);
        }
        outputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

7 个答案:

答案 0 :(得分:4)

问题在于:

if (line.split(" ").length > 1) continue;

每行有超过1个空格,所以代码为:

outputStream.println(line.split(" ")[0]);
永远不会执行

,因为continue会在迭代时直接跳到下一个,所以删除if (line.split(" ").length > 1) continue;检查

修改 在打印消息中添加了line.split(“”)[0]以仅获取第一个单词

答案 1 :(得分:3)

if (line.split(" ").length > 1) continue;

检查行是否包含多个单词/标记,如果是,它会立即开始新的迭代,这意味着您在continue之后跳过其余的代码,这会阻止您执行

outputStream.println(line);

并且由于文件中的每一行都有多个单词,因此您不会向结果文件添加任何内容。

使用Scanner类可以简化您的代码,允许我们使用next()方法迭代单词/标记。

try (Scanner sc = new Scanner(new File(fileName));
     PrintWriter outputStream = new PrintWriter(fileNameOutput);) {
    while (sc.hasNextLine()) {
        outputStream.println(sc.next());// write first word from line
        sc.nextLine();// consume rest of text from that line
    }
} catch (IOException e) {
    e.printStackTrace();
}

注意:请勿在试用部分内调用close()。如果发生outputStream.close(); PrintWriter outputStream会导致extension String { static func myfunc() -> String { return "static" } func myfunc() -> String { return "func" } } let s3 = "" print(s3.myfunc()) // output = "func" print(String.myfunc()) // output = "static" 发生异常,则可能会产生很多问题。您应该将可关闭资源的声明作为try-with-resources的一部分。

答案 2 :(得分:1)

只需使用String#split(String)将其拆分到遇到空间的地方。结果是一个数组。选择后者的第一个索引。

outputStream.println(line);

应替换为

outputStream.println(line.split(" ")[0]);

PS:为了实现这个目的,必须更改if (line.split(" ").length > 1) continue;以允许包含多个单词的字符串。

答案 3 :(得分:1)

split是不必要的,你基本上可以做到

while ((line = bReader.readLine()) != null) {
    lineNum++;
    int spaceIndex = line.indexOf(" ");
    String firstWord = spaceIndex > -1 ? line.substring(0, spaceIndex) : line;
    outputStream.println(firstWord );
}

如果该行为空,您可以添加另一项检查...

答案 4 :(得分:1)

就是这样

  public static void main(String args[]){

     String fileNameOutput = "OutputFile.txt";
        String fileName = "InputWords.txt";

        Charset cs = Charset.defaultCharset() ;
        try (BufferedReader bReader = Files.newBufferedReader(Paths.get(fileName), cs)){

            PrintWriter outputStream = new PrintWriter(fileNameOutput); 
            int lineNum = 0;
            String line = null;

            while ( (line = bReader.readLine() ) != null ) {
               lineNum++;

                outputStream.println(line.split(" ")[0]);

            }
                outputStream.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

}

答案 5 :(得分:1)

你需要使用find第一个空格的索引值 然后使用substring方法将字符串行从0切割为f

的索引

答案 6 :(得分:1)

如果您输入字符串,则可以使用正则表达式来获取它 String [] words = input.split(“[]。* $ * [\ n \ r] {0,}”); 如果您正在从文件中读取,那么您可以使用从文件中读取整个字符串 String input = new String(Files.readAllBytes(Paths.get(“.. your path ..”))); 或者你可以迭代每一行,如果你有大量数据并且你不想一目了然,那么你也可以按照其他方法,并从每一行中提取第一个单词。