如何在 java 中的文件中找到一个 String 并获取它旁边的 String?

How to find a String in a file in java and get String next to it?

假设我有这样一个文件:

Name: someone1 surname
Age: someNumber1
Height: whoCares1
Weight: someWeight1

Name: someone2
Age: someNumber2
Height: whoCares2
Weight: someWeight2

Name: someone3
Age: someNumber3
Height: whoCares3
Weight: someWeight3

我想获取 ArrayList<String> 中 "Name:" 旁边的所有字符串。

我只想为此使用 Scanner class。

我尝试使用如下代码从文件中获取 "Name:" 部分:

while(scanner.hasNextLine()) {
            //read line by line
            String line = scanner.nextLine();

            //code to search for a word in the file which 
                if(line.indexOf("Name:")!=-1) {
                    // will search line by line for this word ignoring numbers in addition
                    // I find the word with this, what next?
                // I want to get word next to Name: and not only from one but from all the instances of the word Name:
                }
                else
                    System.out.println("does not");


        }

我想获取 "Name:" 旁边的单词,不仅来自一个单词,而且来自单词 "Name:" 的所有实例。

我该怎么做?

编辑:

此外,我如何分隔文件中的字符串,例如,如果我想将文件中第一人称的名称存储为一个 ArrayList 中的 someone1 和另一个 ArrayList 中的 surname。我如何将它们分开,并让它们存储在新的 ArrayLists 中。

您可以尝试使用 String#matches 来确定感兴趣的行:

List<String> names = new ArrayList<>();

while (scanner.hasNextLine()) {
    String line = scanner.nextLine();
    if (line.matches("^Name:.*")) {
        names.add(line.replaceAll("^Name:\s+", ""));
    }
}

这里的想法是抓取所有以 Name: 开头的行,然后删除 Name: 前缀,留下您想要的内容。

使用正则表达式的说明:

^      from start of string (line)
Name:  match text 'Name:'
\s+   followed by any number of spaces (or other whitespace)

因此,通过删除 ^Name:\s+,我们应该只在其左侧留下名称信息。

编辑:

例如,如果您的姓名内容实际上是名字和姓氏,那么每一行将如下所示:

Name: George Washington

在这种情况下,如果格式固定,我们可以尝试使用String#split来隔离名字和姓氏:

String[] parts = line.split("\s+");
String first = parts[1];
String last = parts[2];
// then store first and last in separate lists

你要做什么完全取决于你的实际数据。这里有很多边缘案例。也许有些行只有一个名字,或者有些行有中间名、首字母、后缀等。这只是给你一个大概的概念。

以下是从提供的文件中提取姓名列表的实用方法:

public List<String> getNames(File file) throws IOException {
    return Files.lines(file.toPath())
            .filter(str -> str.contains("Name: "))
            .map(str -> str.split("Name: ")[1])
            .collect(Collectors.toList());
}