Java 如何分隔数组开头的名称?
我正在建立一个程序,对包括姓名、地址、电话号码和电子邮件在内的信息进行排序。但是没有用户输入的格式,我在分割信息时遇到了问题。有什么建议吗 我尝试使用if/else语句的组合,我必须使用for循环来遍历所有信息 这就是给我的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
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