@634

正規表現エディタ - 出力フォーマットのバリエーションを増やす

Advertisement

目標

  • 今までのURL抽出用コードに加え、メールアドレスや電話番号などを抽出できるようにする。
  • 出力フォーマットを自由に切り替えられるようにする。

フォーマットのクラス化

実装方法は正規表現とほとんど同じ。

インタフェース:Writer
package regularexpressioneditor.writer;

import java.util.List;

public interface Writer {
    // 論理名の取得
    public String getName();

    // 文字列の出力
    public String write(List list);
}

今までのコードをクラス化する
クラス:TextWriter
package regularexpressioneditor.writer;

import java.util.List;

public class TextWriter implements Writer{
    // 論理名の取得
    public String getName() {
        return "テキスト出力";
    }

    // 文字列の出力
    public String write(List list){
        StringBuffer buffer = new StringBuffer();

        for(int i = 0; i < list.size(); i++){
            buffer.append((String)list.get(i));
            buffer.append("\r\n");
        }
        return buffer.toString();
    }

}

例としてカンマ区切のCSVで出力するクラスを作成
クラス:CsvWriter
package regularexpressioneditor.writer;

import java.util.List;

public class CsvCommaWriter implements Writer{
    public static final String SEPARATOR = ",";

    // 論理名の取得
    public String getName() {
        return "CSV(カンマ区切)";
    }

    // 文字列の出力
    public String write(List list){
        StringBuffer buffer = new StringBuffer();

        for(int i = 0; i < list.size(); i++){
            buffer.append((String)list.get(i));
            if(i != list.size() - 1){
                buffer.append(SEPARATOR);
            }
        }
        return buffer.toString();
    }
}

これらのWriter実装クラスを管理するクラスを作成する
クラス:WriteManager
package regularexpressioneditor.writer;

import java.util.Vector;
import javax.naming.NamingException;

public class WriteManager {
    private Vector writers = new Vector();

    // 初期化
    // 管理するクラスをインスタンス化する
    public WriteManager(){
        this.writers.add(new CsvCommaWriter());
        this.writers.add(new TextWriter());
    }

    // 管理するクラス群を返す
    public Vector getWriters(){
        return writers;
    }

    // 名前でクラスを検索する
    public Writer lookup(String name) throws NamingException{
        for(int i = 0; i < writers.size(); i++){
            Writer writer = (Writer)writers.elementAt(i);
            if(writer.getName().equals(name)){
                return writer;
            }
        }
        throw new NamingException(name + "はバインドされていません");
    }
}
lookupメソッドの速度を速くするなら、Vectorではなくjava.util.HashMapクラスなどを利用する方法が考えられる。

既存コードへの組み込み

クラス化した出力クラス群を、現行のコードに組み込む
MainFrameクラス
package regularexpressioneditor.gui;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.naming.NamingException;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTextPane;

import regularexpressioneditor.config.RegularExpression;
import regularexpressioneditor.config.RegularExpressionManager;
import regularexpressioneditor.writer.WriteManager;
import regularexpressioneditor.writer.Writer;

public class MainFrame extends JFrame{

    // 左パネル
    JTextPane text;                // テキストパネル
    JScrollPane spanel_left;    // スクロールパネル

    // 右パネル
    JTextPane result;            // テキストパネル
    JScrollPane spanel_right;    // スクロールパネル

    // メニュー
    JMenuBar menuBar;            //  メニューバー
    JMenu file;
    JMenu edit;
    JMenuItem open;
    JMenuItem save;
    JMenuItem quit;
    JMenuItem check;

    // 正規表現
    RegularExpressionManager expressionManager;
    RegularExpression expression;
    JMenu expression_choice;

    // 出力
    WriteManager writeManager;
    Writer writer;
    JMenu writer_choice;

    /**
     * 初期設定を行う
     */
    public MainFrame(){

        this.setDefaultCloseOperation(EXIT_ON_CLOSE);

        // 左ウィンドウ
        text = new JTextPane();
        spanel_left = new JScrollPane(text);

        // 右ウィンドウ
        result = new JTextPane();
        spanel_right = new JScrollPane(result);

        //メニュー
        menuBar = new JMenuBar();
        file = new JMenu("ファイル");
        edit = new JMenu("編集");
        open = new JMenuItem("開く");
        save = new JMenuItem("名前を付けて保存");
        quit = new JMenuItem("終了");
        check = new JMenuItem("文字列抽出");
        expression_choice = new JMenu("抽出対象");
        writer_choice = new JMenu("出力形式");

        // 正規表現グループ
        expressionManager = new RegularExpressionManager();
        Vector expressionList = expressionManager.getWriters();
        ButtonGroup expressionGroup = new ButtonGroup();
        for(int i = 0; i < expressionList.size(); i++){
            String name = ((RegularExpression)expressionList.get(i)).getName();
            JMenuItem work = new JRadioButtonMenuItem(name);
            if(i == 0){
                work.setSelected(true);
                setExpressionSelectedItem(name);
            }
            expressionGroup.add(work);
            expression_choice.add(work);
            work.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e){
                    setExpressionSelectedItem(e.getActionCommand());
            }});
        }
        edit.add(expression_choice);

        // 出力形式グループ
        writeManager = new WriteManager();
        Vector writeList = writeManager.getWriters();
        ButtonGroup writeGroup = new ButtonGroup();
        for(int i = 0; i < writeList.size(); i++){
            String name = ((Writer)writeList.get(i)).getName();
            JMenuItem work = new JRadioButtonMenuItem(name);
            if(i == 0){
                work.setSelected(true);
                setWriterSelectedItem(name);
            }
            writeGroup.add(work);
            writer_choice.add(work);
            work.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e){
                    setWriterSelectedItem(e.getActionCommand());
            }});
        }
        edit.add(writer_choice);

        // リスナ登録
        open.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                openDocument();
        }});
        save.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                saveDocument();
        }});
        quit.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                quit();
        }});
        check.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                check();
        }});

        //メニュー構築
        file.add(open);
        file.add(save);
        file.add(new JSeparator());
        file.add(quit);
        edit.add(check);

        //メニューバーにメニューを追加。
        menuBar.add(file);
        menuBar.add(edit);

        //メニューバーをコンテナに追加。
        setJMenuBar(menuBar);

        // スクロールバー設定
        spanel_left.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        spanel_right.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

        // レイアウト
        this.getContentPane().setLayout(new GridLayout(1, 2));

        // パネル設定
        this.getContentPane().add(spanel_left);
        this.getContentPane().add(spanel_right);
    }

    //抽出条件の選択
    public void setExpressionSelectedItem(String name){
        try{
            expression = expressionManager.lookup(name);
        }catch(NamingException ne){
            ne.printStackTrace();
            System.exit(-1);
        }
    }

    //出力フォーマットの選択
    public void setWriterSelectedItem(String name){
        try{
            writer = writeManager.lookup(name);
        }catch(NamingException ne){
            ne.printStackTrace();
            System.exit(-1);
        }
    }

    //ファイルを開く
    public void openDocument(){
        try{
            text.setText(Dialog.open(this));
        }catch(IOException e){
            e.printStackTrace();
        }
    }

    //ファイルの保存
    public void saveDocument(){
        try{
            Dialog.save(this, result.getText());
        }catch(IOException e){
            e.printStackTrace();
        }
    }

    //プログラムの終了
    public void quit(){
        int result = JOptionPane.showConfirmDialog(getContentPane(), "終了しますか?");
        if(result == 0){
            System.exit(0);
        }
    }

    //データ抽出
    public void check(){
        // URLを正規表現で定義
        Pattern pattern = Pattern.compile(expression.getRegularExpression());

        // 比較対照文字列
        Matcher matcher = pattern.matcher(text.getText());

        // リスト作成
        ArrayList list = new ArrayList();
        while(matcher.find()){
            list.add(matcher.group());
     	}

        // 整形
        String text = writer.write(list);

        // テキスト設定
        result.setText(text);
    }
}

動作イメージ

出力形式選択
図1:出力形式を選択する

抽出結果
図2:結果がカンマ区切のCSV形式で抽出された。

Advertisement

ショートカット

634
634ブログ
このカテゴリのトップページに戻る
Incubator(Pukiwiki)
634ラボ
   UIコレクションギャラリー
   ZO-3ジェネレーター

サイト検索


Y!ログール