如何在java中查找文件中的字符串并在其旁边获取字符串?
假设我有这样一个文件:如何在java中查找文件中的字符串并在其旁边获取字符串?,java,file,file-handling,Java,File,File Handling,假设我有这样一个文件: Name: George Washington 姓名:某人 年龄:1岁左右 身高:谁在乎1 重量:一些重量1 姓名:某人2 年龄:2岁左右 身高:谁在乎 体重:体重2 姓名:某人 年龄:3岁左右 身高:谁在乎 重量:大约重量3 我想获取名称旁边的所有字符串:在ArrayList中 我只想为此使用Scanner类 我尝试的是使用如下代码从文件中获取名称:part: Name: George Washington whilescanner.hastline{ //逐行阅读
Name: George Washington
姓名:某人
年龄:1岁左右
身高:谁在乎1
重量:一些重量1
姓名:某人2
年龄:2岁左右
身高:谁在乎
体重:体重2
姓名:某人
年龄:3岁左右
身高:谁在乎
重量:大约重量3
我想获取名称旁边的所有字符串:在ArrayList中
我只想为此使用Scanner类
我尝试的是使用如下代码从文件中获取名称:part:
Name: George Washington
whilescanner.hastline{
//逐行阅读
字符串行=scanner.nextLine;
//用于在文件中搜索单词的代码
ifline.indexOfName:!=-1{
//将逐行搜索此单词,同时忽略数字
//我找到了这个词,接下来呢?
//我想在Name:旁边找到单词,不仅是从一个单词,而且是从单词Name的所有实例中:
}
其他的
System.out.PrintLnNots;
}
我想在Name:旁边获取word,不仅从Name:的一个实例,而且从Name:的所有实例中获取
我该怎么做
编辑:
另外,如何在文件中分隔字符串,例如,如果我想在一个ArrayList中将文件中第一个人的名字存储为someone1,在另一个ArrayList中将姓氏存储为someone1。如何将它们分开,并将它们存储在新的ArrayList中。您可以尝试使用Stringmatches来识别感兴趣的行:
List<String> names = new ArrayList<>();
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
if (line.matches("^Name:.*")) {
names.add(line.replaceAll("^Name:\\s+", ""));
}
}
因此,通过删除^Name:\\s+,我们应该只保留此页面左侧的名称信息
编辑:
例如,如果您的姓名内容实际上是名字和姓氏,那么每一行的外观如下所示:
Name: George Washington
在这种情况下,如果格式是固定的,我们可以尝试使用Stringsplit来隔离名字和姓氏:
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());
}
谢谢你的回答,你能告诉我names.addline.split\\s+[1]是如何将字符串添加到文件名称旁边的吗?@Manhar重新加载页面,因为我从那时起就更改了我的答案。是的,它适用于你碰巧在问题中显示的确切数据,但如果名称中有空格,它将失败。上面的版本使用起来更安全,除非你绝对确定没有名字会有空格。知道这个很酷,谢谢。最后一件事,你能告诉我“^”和“*是如何工作的吗?我知道正则表达式中的\\s+,但是你能告诉我这些字符串是如何添加到代码的功能中的吗?^的意思就是从这里开始,并且。*这之后的任何事情都是确定的。请不要在其他人给出答案后更改你的问题。如果您的更改会使这些答案无效,则尤其如此。如果您的要求已更改,则您至少应向我们展示新数据的外观。@TimBiegeleisen我没有更改问题,这只是对您的答案的补充。虽然这可能会给出有效的结果,考虑到OP说:我只想使用扫描仪类来实现这一点。