SQLの窓

2015年09月04日


Java : テキストファイルを読み込んで正規表現で置換

テキストファイルの一括読み込みが必要でしたが、結局一行づつ読み込んで結合するのがオーソドックスのようです。正規表現は、パターンが解っておれば、他の言語より解りやすいと思いました。
( ここでは、簡易的に String を結合していますが、本来は StringBufferStringBuilder を使用します )

パターンの意味

"max_execution_time\s*=\s*[^\n]*?\n"

max_execution_time で始まって、0個以上空白文字の次に = があって、その
次に0個以上空白文字があって、さらに改行以外の文字が0個以上あって改行で
終わる。
※ \s は空白文字です。その後に * が続くので、 \s* で0個以上の空白文字です

[^\n]*? の ? は一番短い一致ですが、この場合省略してもOKです。
[^\n]* が改行以外なので、かならず最短になります。

max_execution_time\s*=\s*\d+ を使うと、行の最後までを判断せずに
必要な部分のみを置換する事ができます
※ ここでは、(\d+) としてサブマッチで使っています
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class Main {

	public static void main(String[] args) {
		Main thisClass = new Main();
		thisClass.testAction();
	}

	// メソッド
	void testAction() {
		MyTool out = new MyTool(">>>");
		out.println("処理開始");

		String textData = "";
		
		try {
			// 生のバイトのストリーム
			FileInputStream fis = new FileInputStream( "c:\\php\\php.ini" );
			// SHIFT_JIS として読み込む為の準備
			InputStreamReader isr = new InputStreamReader(fis, "Windows-31j");
			// 行単位で読み込む為の準備
			BufferedReader br = new BufferedReader(isr);
		
			String line_buffer = "";
			// BufferedReader は、readLine が null を返すと読み込み終了
			while ( null != (line_buffer = br.readLine() ) ) {
				textData += line_buffer + "\n";
			}
		
			// 閉じる
			br.close();
			isr.close();
			fis.close();
		}
		catch( Exception e ) {
			textData = e.toString();
		}
		
		// 置換対象の内容確認
		out.printlnTarget(textData);

		// その文字列のみの置換
		// ( = の前後に一つのスペースが入っていないと置換できません )
		String textData1 = textData.replace("max_execution_time = 30", "max_execution_time = 90");
		// 置換結果の確認
		out.printlnTarget(textData1);

		// その文字列と、行の終わりまでの置換
		Pattern regPat = Pattern.compile("max_execution_time\\s*=\\s*[^\\n]*?\\n");
		Matcher regMat = regPat.matcher(textData);
		String textData2 = regMat.replaceAll("max_execution_time = 90\n");
		// 置換結果の確認
		out.printlnTarget(textData2);

		out.println("処理終了");
	}

	// *****************************************************
	// 内部用クラス
	// *****************************************************
	class MyTool {

		private String mark = null;

		// コンストラクタ
		MyTool(String pm) {
			mark = pm;
		}

		public void println(String str) {
			System.out.println( this.mark + str );
		}
		
		public void printlnTarget(String text) {
			Pattern regPat = Pattern.compile("max_execution_time\\s*=\\s*(\\d+)");
			Matcher regMat = regPat.matcher(text);

			println( "サブマッチ数 : " + regMat.groupCount()+"" );
			// find を実行しないと、サブマッチを取得できない
			if (regMat.find()) {
				println( regMat.group(0) ); // マッチ全体
				println( regMat.group(1) );	// ここが数字部分
			}
			System.out.println();
			
		}

	}	
	
}



タグ:java 正規表現
【java : テキストファイルの最新記事】
posted by lightbox at 2015-09-04 02:57 | java : テキストファイル | このブログの読者になる | 更新情報をチェックする
バッチ処理

Microsoft Office
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり