Java中如何检查字符串格式?

3
我正在上一门课程,由于错过了一两节课,所以在做某个任务时遇到了困难。(我知道“代替别人完成作业”是被鄙视的,但我并不是那个意思。)
任务要求如下:
编写一个程序,完成以下功能:
提示输入某人的名字,名字包括名、中间名和姓,可以使用任何大小写字母的组合。
检查输入的格式是否正确(3个名称用空格分隔)。如果输入格式不正确,则继续请求更正格式的输入。
将每个部分的名字的首字母大写,并打印出修订后的姓名。
打印该姓名的缩写形式。
以“姓,名,中间名”的格式打印出该名字。
我遇到的主要问题是任务的第二部分;我已经解决了第一部分,我相信在设置第二部分之后,我可以成功地完成其余任务。
import java.util.*;

public class TestStrings
{
public static void main(String[] args) 
{
    Scanner key = new Scanner(System.in);
    String name;
    System.out.print("Enter your name as 'First Middle Last': ");
    name = key.nextLine();




}
}

据我所知,我需要使用string.split方法吗?但是我不确定如何处理,因为我需要检查是否有三个空格,而不仅仅是紧挨着的空格,例如“John(three spaces)Doe”。我猜测这将是一种循环,以检查输入的姓名。
问题在于,我不能使用数组或StringTokenizer。我必须使用substring方法。
感谢您的帮助。谢谢。:D

3
虽然我不太喜欢帮别人做作业,但请注意String类的方法,特别是substring和indexof方法。您可以在http://docs.oracle.com/javase/6/docs/api/java/lang/String.html上查看相关信息。 - Daniel Moses
1
查找正则表达式,它将成为你在学校之后很长一段时间的好朋友。 - bluesman
@Steven Hickey 你应该一定要试一试我的代码。 - Juvanis
1
@bluesman,我不同意。在这个级别上,正则表达式会让他摸不着头脑。他现在应该像瘟疫一样避免它们。至少暂时不要去用。 - JP Richardson
5个回答

5
为了指导您找到名字(因为您不能使用数组),以下是正确的方向:

要指向正确的方向以查找名字(因为您无法使用数组):

String firstName = input.substring(0, input.indexOf(" "));

这将从开头获取一个子字符串直到第一个空格。如果您研究indexOf和substring方法,您应该能够继续下去。


1
+1 读完原帖的问题并不替他完成作业。 - Brian Roach

0
你可以使用字符串类的 substring 和 indexOf 函数来获取你需要的内容。 String#indexOf:获取一个字符串在另一个字符串中的位置。 String#substring:获取包含在字符串中的子字符串。
String s = "Luiggi Mendoza J.";
String x;
while(s.indexOf(" ") > 0) {
    x = s.substring(0, s.indexOf(" "));
    System.out.println(x);
    s = s.substring(s.indexOf(" ") + 1);
}
x = s;
System.out.println(x);

程序的输出将会是:

Luiggi
Mendoza
J.

1
OP说他不能使用数组,需要使用子字符串方法。 - jzworkman

0
使用while循环不断检查用户是否输入了一个由单个空格字符' '分隔的3部分字符串,然后使用split()函数验证字符串的3个部分。通过在此处演示的使用substring(),您可以单独获取名称:
public static void main ( String [] args )
{
    String name = "";
    boolean ok = false;
    Scanner key = new Scanner( System.in );

    while ( !ok )
    {
        System.out.print( "Enter your name as 'First Middle Last': " );
        name = key.nextLine();
        try
        {
            if ( name.split( " " ).length == 3 )
                ok = true;
        }
        catch ( Exception e ){ }
    }

    if ( ok )
    {
       String firstName = name.substring(0, name.indexOf(" "));
       String middleName = name.substring(firstName.length()+1, 
                                       name.lastIndexOf(" "));
       String surname = name.substring(middleName.length()+firstName.length()+2,
                                     name.length());
    }
}

如果您仔细阅读完整的问题,OP说他不能使用数组,必须使用子字符串。 - jzworkman

0
这个可以通过模式匹配、正则表达式来实现。同时,在调整大小写时,可以避免字符串长度为1的情况。
private static String properCase(String str) {
    return str.substring(0, 1).toUpperCase()
            + (str.length() >= 1 ? str.substring(1).toLowerCase() : "");
}

public static void main(String[] args) {

    boolean found = false;
    do {
        Scanner scanner = new Scanner(System.in);
        System.out.print("Enter your name as 'First Middle Last': ");
        Pattern p = Pattern.compile("\\s*(\\w+?)\\s(\\w+?)\\s(\\w+)+\\s*");
        Matcher m = p.matcher(scanner.nextLine());
        found = m.find();
        if (found) {
            String first = m.group(1);
            String middle = m.group(2);
            String last = m.group(3);

            String revised = properCase(first) + " " + properCase(middle)
                    + " " + properCase(last);

            System.out.println(revised);
            System.out
                    .printf("%s %s %s.\n", properCase(last),
                            properCase(first), middle.substring(0, 1)
                                    .toUpperCase());
        }
    } while (!found);
}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接