正規表現エディタ - 出力フォーマットのバリエーションを増やすAdvertisement目標
フォーマットのクラス化
実装方法は正規表現とほとんど同じ。
インタフェース: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!ログール |