Java-以特定方式切割字符串

时间:2020-02-21 11:50:46

标签: java string

我有一个字符串(取自文件):

计算机:英特尔,图形卡: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”。 我不知道如何从同一行中提取更多单词,而从下一行中提取单词。

6 个答案:

答案 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

受到thisthis 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();
    }