-3

重複の可能性:
Java の trim() メソッドに関するクエリ

サイトのユーザー名やその他の情報を解析していますが、それぞれの後にたくさんのスペースがあります (ただし、単語の間にはスペースがあります)。例: 「ビルダーのボブ」または「溶接工のサム」。スペースの数は、名前によって異なります。以前に使用したことがあるので、.trim() を使用するだけでよいと考えました。しかし、それは私に問題を与えています。私のコードは次のようになります。

for (int i = 0; i < splitSource3.size(); i++) {
            splitSource3.set(i, splitSource3.get(i).trim());
}

結果はまったく同じです。末尾のスペースは削除されません。すばらしい回答をありがとうございます。

アップデート:

最初に解析される HTML タグがあるため、完全なコードはもう少し複雑です。まさに次のようになります。

for (String s : splitSource2) {
        if (s.length() > "<td class=\"dddefault\">".length() && s.substring(0, "<td class=\"dddefault\">".length()).equals("<td class=\"dddefault\">")) {
                splitSource3.add(s.substring("<td class=\"dddefault\">".length()));
        }
}

System.out.println("\n");
    for (int i = 0; i < splitSource3.size(); i++) {
            splitSource3.set(i, splitSource3.get(i).substring(0, splitSource3.get(i).length() - 5));
            splitSource3.set(i, splitSource3.get(i).trim());
            System.out.println(i + ": " + splitSource3.get(i));
    }
}

アップデート:

落ち着け。Java に問題があるとは決して言いませんでしたし、それがバグだとか、壊れているとか、そういうことだとも言いませんでした。私は単に問題があると言って、あなたが協力して私の問題を解決するのを助けるために私のコードを投稿しました. 「Javaの問題」ではなく、「私の問題」というフレーズに注意してください。私は実際にコードを印刷してもらいました

System.out.println(i + ": " + splitSource3.get(i) + "*");

その後、for each ループで。

これで自分に問題があることがわかりました。ちなみに、問題はまだ修正されていません。

アップデート:

出力例 (一重引用符を除く):

'0: Olin D. Kirkland                                          '
'1: Sophomore                                          '
'2: Someplace, Virginia  12345<br />VA SomeCity<br />'
'3: Undergraduate                                          '

OP を編集して、 Java の trim() メソッドに関する Queryでの彼の質問を言い換えましたString.trim()

4

2 に答える 2

0

私にとっては問題なく動作します。

ここで、コードは少しリファクタリングされ、(おそらく)読みやすくなっています。

final String openingTag = "<td class=\"dddefault\">";
final String closingTag = "</td>";
List<String> splitSource2 = new ArrayList<String>();
splitSource2.add(openingTag + "Bob the Builder " + closingTag);
splitSource2.add(openingTag + "Sam the welder " + closingTag);
for (String string : splitSource2) {
    System.out.println("|" + string + "|");
}
List<String> splitSource3 = new ArrayList<String>();
for (String s : splitSource2) {
    if (s.length() > openingTag.length() && s.startsWith(openingTag)) {
        String nameWithoutOpeningTag = s.substring(openingTag.length());
        splitSource3.add(nameWithoutOpeningTag);
    }
}

System.out.println("\n");
for (int i = 0; i < splitSource3.size(); i++) {
    String name = splitSource3.get(i);
    int closingTagBegin = splitSource3.get(i).length() - closingTag.length();
    String nameWithoutClosingTag = name.substring(0, closingTagBegin);
    String nameTrimmed = nameWithoutClosingTag.trim();
    splitSource3.set(i, nameTrimmed);
    System.out.println("|" + splitSource3.get(i) + "|");
}

それは本当の答えではないことは知っていますが、コメントを投稿することができず、コメントとしてこのコードが収まらないので、OlinKirklandが彼のコードをチェックできるように答えました。

于 2012-09-09T20:20:05.567 に答える
0

スクリーンスクレイピングプロジェクトに取り組んでいたときに、この種の問題が発生していたことに気づきました。重要なのは、ダウンロードされた HTML ソースに、空白以外の文字である印刷不可能な文字が含まれている場合があることです。これらをブラウザにコピーして貼り付けるのは非常に困難です。これがあなたに起こった可能性があると思います。

私の仮定が正しければ、次の 2 つの選択肢があります。

  1. バイナリ リーダーを使用して、それらの文字が何であるかを把握し、String.replace(); で削除します。例えば:

    private static void cutCharacters(String fromHtml) {
        文字列結果 = fromHtml;
        char[] problemCharacters = {'\000', '\001', '\003'}; //これはプライベートな static final 定数でもあります
        for (char ch : problemCharacters) {
            結果 = 結果.replace(ch, ""); //入力パラメーターを変更するのは面倒です。しかし、それは例として行います
        }
        結果を返します。
    }
    
  2. 解析する HTML にある種の繰り返しパターンが見つかった場合は、正規表現と部分文字列を使用して不要な部分を切り取ることができます。例えば:

    プライベート文字列 getImportantParts(String fromHtml) {
        パターン p = Pattern.compile("(\\w*\\s*)"); //これは、private static final 定数でもあります。
        マッチャー m = p.matcher(fromHtml);
        StringBuilder buff = new StringBuilder();
        while (m.find()) {
            buff.append(m.group(1));
        }
        return buff.toString().trim();
    }
    
于 2012-09-26T06:04:25.750 に答える