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