2

について質問がありindexOf()ます。EmailExtractorユーザーが入力した文から電子メール アドレス全体を抽出する (はい、これは宿題ですが、コードは探していません) をプログラムしようとしています。

例 - ユーザー入力: abc@def.ghi.jk にクエリをメールで送信してください。 プログラムは、上記のabc@def.ghi.jkStringを表示します。私は理解indexOf()し、substring()必要とされています。

私が今持っているアイデアはindexOf()、「@」を見つけるために使用し、ユーザーが入力した電子メールアドレスの直前の空白を検索することです (n 番目)。

私のコードは次のとおりです。

System.out.println("This is an Email Address Extractor.\n");
System.out.print("Enter a line of text with email address: ");
String emailInput = scn.nextLine();
int spaceAt = emailInput.indexOf(" ");
for (int i = 1; i <= emailInput.indexOf("@"); i++){
    if (spaceAt < emailInput.indexOf("@")) {
        spaceAt = emailInput.indexOf(" ", spaceAt + 1);
    }
}

私は自分のコードの問題を理解し、認識しています。

1)"Mail us at abc@def.ghi.jk with your queries".indexOf(" ")は 4 です。10 を取得しようとしています。しかし、入力した IF 条件により、25 である indexOf() の次のインスタンスにスキップされます (10 < 14 のため)。

これが起こらないようにするにはどうすればよいですか?

繰り返しますが、私は純粋に答えを探しているのではなく、解決策を回避しようとしています。前もって感謝します!

4

3 に答える 3

3

@の前後のスペースを探してみてはどうですか?

int at = emailInput.indexOf('@');
int start = emailInput.lastIndexOf(' ', at) + 1;
int end = emailInput.indexOf(' ', at);
if (end == -1) end = emailInput.length();
String email = emailInput.substring(start, end);
于 2013-09-20T16:13:01.363 に答える
0

indexOf()andの代わりに正規表現を使用できますsubstring()

^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"+"[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"

パターンとマッチャーを使用して、文字列内の電子メール ID を検証します。 これはあなたにそれについての明確な見解を与えるかもしれません

于 2013-09-20T16:15:39.790 に答える
0

できることの 1 つはindexOf、次の反復のためにチェックを保存する代わりに、ループの同じ反復で結果を呼び出してテストすることです。ほとんどの疑似コードで次のようなもの:

spaceAt := 0
indexOfAtSign := emailInput.indexOf('@');
while (spaceAt < indexOfAtSign) { // you never really used i anyway
    temp := index of next space
    if (temp > indexOfAtSign) break;
    else spaceAt = temp;
}

(コーナーケースのテストが少し必要ですが、@ 記号の前または @ 記号の後にスペースがない場合のみ)

于 2013-09-20T16:24:33.397 に答える