2

私はJavaが初めてで、私のコードよりも簡単な答えがあると思われる問題を解決しようとしています.問題は、ユーザーが入力した任意の長さの名前のイニシャルを完全な姓とともに出力することでした.しかし、これはString.split() または配列を使用せずに実行する必要があります。ユーザーに一度に 1 語ずつ名前を入力してもらいましたが、名前全体を一度に取得して必要に応じて実行する方法はありますか。私のコードは次のとおりです。

import java.io.*;
public class Initials {
    public static void main(String[]args)throws IOException{
        BufferedReader br =  new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Enter the number of words your name contains");
        int n=Integer.parseInt(br.readLine());
        String str="";
        for(int x=1;x<=n-1;x++){
            System.out.println("Enter your name's word number:"+" "+x);
            String s=br.readLine();
            String st=s.toUpperCase();
            char ch=st.charAt(0);
            str=str+ch+".";
        }
        System.out.println("Enter your surname");
        String sur=br.readLine();
        str=str+" "+sur.toUpperCase();
        System.out.println(str);
    }
}
4

3 に答える 3

5

正規表現 (すなわち(?<=\w)\w+(?=\s))を使用します。

String name = "John Paul Jones";  // read this from the user
System.out.println(name.replaceAll("(?<=\\w)\\w+(?=\\s)", "."));
JPジョーンズ

いいえsplit()、配列はありません:)


簡単な説明: 基本的に、最初の文字を除く空白文字が続く各単語のすべての文字を文字に置き換えたいと考えてい.ます。そのような単語を照合するには、次を使用します(?<=\w)\w+(?=\s)

  • (?<=\w)肯定的な後読みです。一致の開始時に単語文字が存在することを確認しますが、一致自体には含まれません。このコンポーネントがあるのは、各名前の最初の文字ではなく、最初の文字以外のすべてに一致させたいためです (姓は除きます。これについてはすぐに説明します)。
  • \w+単語文字の連続した文字列に一致します。これを使用して、名前の残りの部分を一致させます。
  • (?=\s)前向きな先読みです。一致の後に空白文字が続くことを確認しますが、一致自体には含まれません。このコンポーネントを含めているのは、姓の後に空白文字が続くべきではないため、正規表現と一致してはならないため、姓の何かを置き換えたくないからです。
于 2013-06-26T14:47:34.737 に答える