我有一个字符串(取自文件):
计算机:英特尔,图形卡:Nvidia,
鼠标:剃须刀,颜色:白色 等
我需要在“:”和“,”之间输入文字。
当我以此方式进行操作
Scanner sc = new Scanner(new File(path));
String str = sc.nextLine();
ArrayList<String> list = new ArrayList<String>();
while (sc.hasNextLine()) {
for (int i = 0; i < str.length(); i++) {
list.add(str.substring(str.indexOf(":"), str.indexOf(",")));
}
System.out.println("test");
sc.nextLine();
}
我只使用“:intel”。 我不知道如何从同一行中提取更多单词,而从下一行中提取单词。
答案 0 :(得分:1)
您面临此问题,因为indexof()函数返回该字符在字符串中的首次出现。因此,您将获得第一次出现的':'和第一次出现的','之间的子字符串。要解决您的问题,请使用带有str.substring的函数FirstIndexOf()和LastIndexOf()而不是函数IndexOf()。这将返回第一次出现的':'和最后一次出现的','之间的子字符串。我希望这个答案对您有帮助。
答案 1 :(得分:1)
假设文件内容为test.txt
,如下所示:
Computer: intel, graphic card: Nvidia
Mouse: razer, color: white
以下程序将
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;
class Coddersclub {
public static void main(String[] args) throws FileNotFoundException {
Scanner sc = new Scanner(new File("test.txt"));
ArrayList<String> list = new ArrayList<String>();
String str = "";
while (sc.hasNextLine()) {
str = sc.nextLine();
String[] specs = str.split(",");
for (String item : specs) {
list.add(item.substring(item.indexOf(":") + 1).trim());
}
}
System.out.println(list);
}
}
输出:
[intel, Nvidia, razer, white]
注意:如果您要查找的列表是[: intel, : Nvidia, : razer, : white]
,请用list.add(item.substring(item.indexOf(":") + 1).trim());
替换list.add(item.substring(item.indexOf(":")).trim());
。
如果您正在寻找其他东西,请随时发表评论。
答案 2 :(得分:1)
常绿的解决方案是:
String string = "Computer: intel, graphic card: Nvidia,";
Map<String,String> map = Pattern.compile("\\s*,\\s*")
.splitAsStream(string.trim())
.map(s -> s.split(":", 2))
.collect(Collectors.toMap(a -> a[0], a -> a.length>1? a[1]: ""));
System.out.println(map.values());
输出:
[ Nvidia, intel]
答案 3 :(得分:0)
您可以为此使用正则表达式。
要提取一行中的:
和最后一个,
之间的文本,请使用以下命令:
(?<=\:)(.*?)(?=\,\n)
然后您可以执行以下操作:
String mytext = "Computer: intel, graphic card: Nvidia,\n" +
"Mouse: razer, color: white etc.";
Pattern pattern = Pattern.compile("(?<=\:)(.*?)(?=\,\n)");
Matcher matcher = pattern.matcher(mytext);
if (matcher.find())
{
System.out.println(matcher.group(1));
}
输出将是:
intel, graphic card: Nvidia
受到this和this other线程的启发。
答案 4 :(得分:0)
如下修改代码以解决该问题。
Scanner sc = new Scanner(new File(path));
ArrayList<String> list = new ArrayList<String>();
while (sc.hasNextLine()) {
String str = sc.nextLine();
String[] sp = testString.split(",");
for(int i=0;i<sp.length;i++){
list.add(sp[i].split(":")[1]);
}
}
//您将获得以下列表:英特尔,nvdia,剃刀等。
答案 5 :(得分:0)
我认为,为了获得':'和''之间的所有键,最好将每行用','分割,并将行中的每个元素用':'分割,然后获得右手边的值。 / p>
请尝试以下代码:
Scanner sc;
try {
sc = new Scanner(new File(path));
ArrayList<String> list = new ArrayList<String>();
while (sc.hasNextLine()) {
String informations = sc.nextLine();
String[] parts = informations.split(",");
for( String part : parts) {
list.add(part.substring(part.indexOf(':')+1));
}
}
}
catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}