Java 如何分隔数组开头的名称?

Java 如何分隔数组开头的名称?,java,arrays,sorting,Java,Arrays,Sorting,我正在建立一个程序,对包括姓名、地址、电话号码和电子邮件在内的信息进行排序。但是没有用户输入的格式,我在分割信息时遇到了问题。有什么建议吗 我尝试使用if/else语句的组合,我必须使用for循环来遍历所有信息 这就是给我的 String[] TheNeededData = new String[]{"Alexa Pope/P.O. Box 435 5461 Euismod Avenue1-182-963-3500 blandit.congue@utcurs

我正在建立一个程序,对包括姓名、地址、电话号码和电子邮件在内的信息进行排序。但是没有用户输入的格式,我在分割信息时遇到了问题。有什么建议吗

我尝试使用if/else语句的组合,我必须使用for循环来遍历所有信息

这就是给我的

String[] TheNeededData = new String[]{"Alexa Pope/P.O. Box 435 5461                    Euismod Avenue1-182-963-3500 blandit.congue@utcursus.co.uk",
"Kylynn Allen/8402 Justo St.1-357-430-1865morbi.tristique@lectus.org","Moana Cannon 522-1918 Quisque Rd.    1-752-893-8123  enim.mi@idsapienCras.edu"};
这就是我试过的

    int count;
public TheData(String TheString)
{


    int x = TheString.length();

    for(int y = 0; y<x; y++)
    {
        String z = String.valueOf(TheString.charAt(y));
        if(z.equals("/"))
            System.out.println(TheString.substring(0,y));
        else
        {
            if(count == 1)
                if(z.equals(" "))
                {
              System.out.println(TheString.substring(0,y));
              count++;
            }
            if(count == 0)
                if(z.equals(" "))
                {
                    count ++;
                }

        }
    }    
}

我希望使用字符(“/”)的子字符串来打印前几个名字,然后我尝试通过识别前两个空格来查找姓氏,但是它不仅打印了名称,还多次打印了名称。

因为您不知道数据格式是什么,我会尝试迭代部分或所有条目,并在过程中调整模式

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static java.util.regex.Pattern.CASE_INSENSITIVE;
import static java.util.stream.Collectors.toList;

public class Main {

    private static final Pattern NAME_REGEX =
            Pattern.compile("^([A-Z]+ [A-Z]+ ).*$", CASE_INSENSITIVE);

    private static final Pattern EMAIL_ADDRESS_REGEX =
            Pattern.compile("^.* ([A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}).*$", CASE_INSENSITIVE);

    private static final Pattern PHONE_NUMBER_REGEX =
        Pattern.compile("^.*(\\d-\\d{3}-\\d{3}-\\d{4}).*$", CASE_INSENSITIVE);

    public static void main(String[] args) {
        var data = new String[]{
                "Alexa Pope/P.O. Box 435 5461                    Euismod Avenue1-182-963-3500 blandit.congue@utcursus.co.uk",
                "Kylynn Allen/8402 Justo St.1-357-430-1865morbi.tristique@lectus.org",
                "Moana Cannon 522-1918 Quisque Rd.    1-752-893-8123  enim.mi@idsapienCras.edu"};

        for (var entry : cleanUpData(data)) {
            System.out.println("\n" + entry);

            var name = findMatch(entry, NAME_REGEX).orElse("");
            var phoneNumber = findMatch(entry, PHONE_NUMBER_REGEX).orElse("");
            entry = entry.replace(phoneNumber, " ");
            var emailAddress = findMatch(entry, EMAIL_ADDRESS_REGEX).orElse("");
            System.out.println("Name: " + name);
            System.out.println("Email: " + emailAddress);
            System.out.println("Phone: " + phoneNumber);
        }
    }

    private static List<String> cleanUpData(String[] data) {
        return Arrays.stream(data).map(s -> s
                .replace("/", " ")
                .trim()
                .replaceAll(" +", " ")
        ).collect(toList());
    }

    private static Optional<String> findMatch(String entry, Pattern pattern) {
        Matcher matcher = pattern.matcher(entry);
        if (!matcher.find()) {
            return Optional.empty();
        }
        try {
            return Optional.of(matcher.group(1));
        } catch (NumberFormatException e) {
            return Optional.empty();
        }
    }
}

这似乎是一个很好的起点:)它仍然会给你一段艰难的时间,也许你只想先在
/
上拆分,然后取第一个条目,但从那时起,这就很难了,因为你如何定义一个名字应该具有的格式,如果它是像
George Alexander Charles Tucker
,中间有两个名字,或者一个双重姓氏,你能用这个添加一个语言标签吗,我起初假设它是C#但重新阅读代码清楚地告诉我它不是:)不幸的是,对于这种数据,你能做的只是猜测。在用作分隔符的数据中是否有\t之类的不可见字符?
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import static java.util.regex.Pattern.CASE_INSENSITIVE;
import static java.util.stream.Collectors.toList;

public class Main {

    private static final Pattern NAME_REGEX =
            Pattern.compile("^([A-Z]+ [A-Z]+ ).*$", CASE_INSENSITIVE);

    private static final Pattern EMAIL_ADDRESS_REGEX =
            Pattern.compile("^.* ([A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}).*$", CASE_INSENSITIVE);

    private static final Pattern PHONE_NUMBER_REGEX =
        Pattern.compile("^.*(\\d-\\d{3}-\\d{3}-\\d{4}).*$", CASE_INSENSITIVE);

    public static void main(String[] args) {
        var data = new String[]{
                "Alexa Pope/P.O. Box 435 5461                    Euismod Avenue1-182-963-3500 blandit.congue@utcursus.co.uk",
                "Kylynn Allen/8402 Justo St.1-357-430-1865morbi.tristique@lectus.org",
                "Moana Cannon 522-1918 Quisque Rd.    1-752-893-8123  enim.mi@idsapienCras.edu"};

        for (var entry : cleanUpData(data)) {
            System.out.println("\n" + entry);

            var name = findMatch(entry, NAME_REGEX).orElse("");
            var phoneNumber = findMatch(entry, PHONE_NUMBER_REGEX).orElse("");
            entry = entry.replace(phoneNumber, " ");
            var emailAddress = findMatch(entry, EMAIL_ADDRESS_REGEX).orElse("");
            System.out.println("Name: " + name);
            System.out.println("Email: " + emailAddress);
            System.out.println("Phone: " + phoneNumber);
        }
    }

    private static List<String> cleanUpData(String[] data) {
        return Arrays.stream(data).map(s -> s
                .replace("/", " ")
                .trim()
                .replaceAll(" +", " ")
        ).collect(toList());
    }

    private static Optional<String> findMatch(String entry, Pattern pattern) {
        Matcher matcher = pattern.matcher(entry);
        if (!matcher.find()) {
            return Optional.empty();
        }
        try {
            return Optional.of(matcher.group(1));
        } catch (NumberFormatException e) {
            return Optional.empty();
        }
    }
}
Alexa Pope P.O. Box 435 5461 Euismod Avenue1-182-963-3500 blandit.congue@utcursus.co.uk
Name: Alexa Pope 
Email: blandit.congue@utcursus.co.uk
Phone: 1-182-963-3500

Kylynn Allen 8402 Justo St.1-357-430-1865morbi.tristique@lectus.org
Name: Kylynn Allen 
Email: morbi.tristique@lectus.org
Phone: 1-357-430-1865

Moana Cannon 522-1918 Quisque Rd. 1-752-893-8123 enim.mi@idsapienCras.edu
Name: Moana Cannon 
Email: enim.mi@idsapienCras.edu
Phone: 1-752-893-8123