java - 拆分后如何访问每个元素

标签 java regex arraylist split filereader

我正在尝试读取文本文件并将其分为三个不同的类别。 ID、地址和重量。但是,每当我尝试访问地址和重量时,都会出现错误。有人看出问题了吗?

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.*;

class Project1
{
public static void main(String[] args)throws Exception
{
    List<String> list = new ArrayList<String>();
    List<String> packages = new ArrayList<String>();
    List<String> addresses = new ArrayList<String>();
    List<String> weights = new ArrayList<String>();

    //Provide the file path
    File file = new File(args[0]);

    //Reads the file
    BufferedReader br = new BufferedReader(new FileReader(file));

    String str;
    while((str = br.readLine()) != null)
    {
        if(str.trim().length() > 0)
        {
            //System.out.println(str);
            //Splits the string by commas and trims whitespace
            String[] result = str.trim().split("\\s*,\\s*", 3);
            packages.add(result[0]);

            //ERROR: Doesn't know what result[1] or result[2] is.
            //addresses.add(result[1]);
            //weights.add(result[2]);

            System.out.println(result[0]);
            //System.out.println(result[1]);
            //System.out.println(result[2]);

        }   
    }

    for(int i = 0; i < packages.size(); i++)
    {
        System.out.println(packages.get(i));
    }

}
}

这是文本文件(格式是故意的):

,123-ABC-4567, 15 W. 15th St., 50.1

456-BgT-79876,百老汇 22 号,24 号

QAZ-456-QWER,东 20 街 100 号,50 号

Q2Z-457-QWER,东 20 街 200 号,49 号

678-FGH-9845 ,, 第五大道 45 号,, 12.2,

678-FGH-9846,第五大道 45 号,12.2

123-A BC-9999,46 Foo 酒吧,220.0

347-poy-3465,101 B'way,24

,123-FBC-4567,西 15 街 15 号,50.1

678-FGH-8465 第五大道 45 号 12.2

最佳答案

查看数据中的模式,其中某些行以不需要的逗号开头,某些行具有多个逗号作为分隔符,而一行甚至没有任何逗号分隔符而是空格作为分隔符,您将不得不使用一个正则表达式处理所有这些行为。您可以使用此正则表达式来为您的数据完成所有操作并正确捕获。

([\w- ]+?)[ ,]+([\w .']+)[ ,]+([\d.]+)

这是对上述正则表达式的解释,

  • ([\w- ]+?) - 捕获由单词字符连字符和空格组成的 ID 数据并将其放置在 group1 中
  • [ ,]+ - 充当分隔符,可以是一个或多个空格或逗号
  • ([\w .']+) - 捕获由单词字符、空格和 address 组成的 . 数据,并将其放入 group2
  • [ ,]+ - 如上所述的分隔符
  • ([\d.]+) - 捕获由数字和 weight 组成的 . 数据并将其放入 group3

Demo

这是您可以使用的修改后的 Java 代码。我已经删除了一些变量声明,您可以根据需要将它们恢复。此代码使用 Matcher 对象以您想要的方式捕获后打印所有信息。

Pattern p = Pattern.compile("([\\w- ]+?)[ ,]+([\\w .']+)[ ,]+([\\d.]+)");

// Reads the file
try (BufferedReader br = new BufferedReader(new FileReader("data1.txt"))) {

    String str;
    while ((str = br.readLine()) != null) {
        Matcher m = p.matcher(str);
        if (m.matches()) {
            System.out.println(String.format("Id: %s, Address: %s, Weight: %s",
                    new Object[] { m.group(1), m.group(2), m.group(3) }));
        }
    }
}

打印,

Id: 456-BgT-79876, Address: 22 Broadway, Weight: 24
Id: QAZ-456-QWER, Address: 100 East 20th Street, Weight: 50
Id: Q2Z-457-QWER, Address: 200 East 20th Street, Weight: 49
Id: 678-FGH-9845, Address: 45 5th Ave, Weight: 12.2
Id: 678-FGH-9846, Address: 45 5th Ave, Weight: 12.2
Id: 123-A BC-9999, Address: 46 Foo Bar, Weight: 220.0
Id: 347-poy-3465, Address: 101 B'way, Weight: 24
Id: 678-FGH-8465, Address: 45 5th Ave, Weight: 12.2

如果您有任何疑问,请告诉我这是否适合您。

关于java - 拆分后如何访问每个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54568228/

相关文章:

java - 小部件 ID 和 Intent

regex - postgres 日期验证正则表达式

mysql - 如何提取MySQL字符串中的第n个单词并统计单词出现次数?

java - ArrayList 的自定义方法

java - 递归 Java 与 Python

java - 在java中将对象添加到链表/数组列表

java - 连接到 IMAP javax.net.ssl.SSLException : Unrecognized SSL message

java - 斐波那契偶数之和

java - 在 Java 中通过 Socket.IO 进行 POST 和 PUT

regex - 从文本文件中提取特定数据