クラスライブラリ応用

演習問題

解答は

に提出しなさい。クラスファイル (〜.class) は提出不要。 提出は gFTP 等の ftp ソフトを用いて行うこと。

注意

正規表現中でのエスケープ文字は円マーク「¥」(右上のキー)ではなく、バックスラッシュ「\」(右下のキー)を使うこと。

問題1

標準入力からテキストを読み込み、 中に書かれているメールアドレスを すべて取り出して表示するプログラムを作成しなさい。 メールアドレスのローカル部(@の前)に使われる文字は英数字と . _ - + だけに限定してもよい。 twitter のアカウントの記述(例: @masason)を取り出さないようにすること。

main メソッドのあるクラスのクラス名は MailAddressExtractor とする。

標準入力から1行ずつ読み込むのには、以下のように Scanner クラスを使ってもよい。 なお 1行ずつ処理する場合には、1行の中に複数のメールアドレスがあってもすべて取り出せるようにすること。

import java.util.*;
import java.util.regex.*;

public class MailAddressExtractor {
    public static void main(String[] args) {
        
        // メールアドレスにマッチする正規表現を表す Pattern オブジェクトを用意
        Pattern pattern = Pattern.compile("ここに正規表現を書く");
        
        // Scanner クラスを使って標準入力(System.in)から読み込む
        Scanner scanner = new Scanner(System.in);
        while(scanner.hasNext()) {
            // 1行読み込む
            String line = scanner.nextLine();
            // 読み込んだ line の中からマッチする部分を探す Matcher オブジェクトを用意
            Matcher matcher = pattern.matcher(line);
            // line の先頭から、マッチする部分を探す (Matcher クラスの find() メソッドを利用)
            ...
                // マッチしたら、マッチした部分を取得し表示する。
                // ・マッチした部分全体の取得 group()
                // ・マッチした部分のうち () でくくった部分の取得 group(n)
                //    n は正規表現内の何番目の () でくくった部分を取得したいか(1から数える)
        }
    }
}

集めたメールアドレスに迷惑メールを送ったり、怪しい業者に売ろうとしないこと。

問題2

HTML文書(HTML で記述されたテキスト)を標準入力から読み込み、 アンカー要素(a)のリンク先の URL を すべて取り出して表示するプログラムを作成しなさい。 href 属性の内容をそのまま取り出せばよい (絶対URLに直すなどの処理はしなくてよい)。 xhtml に限定しないので、要素名や属性名は大文字小文字の区別がないことに注意すること (href は HREF でも HRef でも同じ意味になる)。

main メソッドのあるクラスのクラス名は LinkExtractor とする。

問題3

問題2 で取り出したリンクを、以下の3種類に分類して、それぞれ表示しなさい。

「http://」あるいは「https://」で始まるからといって、 他サイトへのリンクとは限らないことに注意すること。 なお、分類するだけでよく、URL を「http:// 〜」の形式に書き直す必要はない。

コマンドライン引数(args[0])で、与える HTML文書の URL を与えること。 なお、HTML文書を標準入力から与えるのではなく、 URLConnection クラスを使うなどして取得してもよい。

main メソッドのあるクラスのクラス名は LinkClassifier とする。

補足: 相対リンクと絶対リンク (授業での説明と同じ)

相対リンク (相対パスによる内部リンク)
リンク先のページの位置を、リンク元のページの位置を基準にして表現したもの。
例: <a href="../image/foo.gif">, <a href="link.html">
絶対リンク (絶対パスによる内部リンク)
基準のページとの比較ではない絶対的な位置指定をしているもの。
例: <a href="/javalib/index.html">

他サイトへのリンク (外部リンク) は絶対リンクの一種であるが、ここでは別に分類すること。

問題4

標準入力から HTML 文書または XML 文書を与え、 文書内で使用されている要素(タグ名)の一覧を作成し表示するプログラムを作成しなさい。 なお、使用されている属性は無視してよい。 正規表現を用い、DOM などは使わないこと(正規表現の練習なので)。

要素名の一覧をあらかじめプログラムで持ち、 それを1つ1つチェックするというプログラムにはしないこと。

余力のある人は、 コメントの中にある場合 <!-- <html> --> や文字列の中にある場合 alt="<html>"、 にはどのように無視するか、 JavaScript のソースの中にある場合はどうするか、 考えてみること。

main メソッドのあるクラスのクラス名は TagNameExtractor とする。

問題5 (Advanced)

標準入力から日本語で書かれた文書を読み込み、 そこで使われている単語とその出現回数を表示するプログラムを作成しなさい。

日本語文から単語を切り出す方法は、 文字種の変わり目を用いる擬似的な方法でよいものとする。 以下を参考にすること。

import java.util.regex.*;
...
    String string;
    Pattern p = Pattern.compile(
        "(\\p{InBasicLatin}+|\\p{InHiragana}+|\\p{InKatakana}+|\\p{InCJKUnifiedIdeographs}+)");
    ...
    (stringに分割したい文字列を代入)
    ...
    Matcher m = p.matcher(string);
    while (m.find()) {
        System.out.println(m.group());
    }

なお、出現回数のカウントには HashMap を用いるとよい (参考)。 余力のある人は頻度順に並べて表示すること。

main メソッドのあるクラスのクラス名は WordCounter とする。