テキストファイルの一括読み込みが必要でしたが、結局一行づつ読み込んで結合するのがオーソドックスのようです。正規表現は、パターンが解っておれば、他の言語より解りやすいと思いました。 ( ここでは、簡易的に String を結合していますが、本来は StringBuffer か StringBuilder を使用します ) パターンの意味 "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 : テキストファイルの最新記事】