Aritalab:Lecture/Programming/Java/Grep
From Metabolomics.JP
Javaにおける文字列処理
ここでは、Javaのページで解説した以下のサンプルプログラムを改良してみましょう。
- ファイルから1行ずつ読み込んで正規表現検索をする Grep.java
import java.io.*; // ioライブラリの全クラスを使えるようにする。 import java.util.regex.*; public class Grep { public static void main(String[] args) { if (args.length < 2) { System.err.println("Usage: Grep pattern file"); System.exit(1); } try { Pattern p = Pattern.compile(args[0]); // java.util.regexで定義される正規表現 BufferedReader br= new BufferedReader (new FileReader(args[1])); // java.ioで定義されるクラス String line; while ((line = br.readLine()) != null) if (p.matcher(line).find()) System.out.println(line); } catch (Exception e) { e.printStackTrace(); } } }
このプログラムは第一引数に正規表現パターン、第二引数にファイル名を取るだけですが、まず複数ファイルを指定できるようにします。ファイルを開いて検索する部分の外側に for ループを追加します。正規表現パターンのコンパイルは1回のところに注意して下さい。
for(int i=1; i < args.length; i++) { BufferedReader br= new BufferedReader (new FileReader(args[i])); // java.ioで定義されるクラス String line; int cnt = 0; while ((line = br.readLine()) != null) { cnt++; if (p.matcher(line).find()) { System.out.println(args[i] + cnt + ": " + line); } } }
Java では配列の長さを args.length のように指定できるので大変便利です。上の例ではファイルに新しくアクセスするたびにカウンター cnt を 0 にして行数を数え、ファイル名と行数の後にヒット行を出力しています。(wiki ではプラス記号を並べると正しく表示されないので++は全角で書いています。)
文字列を扱う際の注意
Java の String クラスは大変便利です。例えば
"pi = " + 3.1415
と書くだけで "pi = 3.1415" という文字列を作成してくれます。しかし文字列を変更するたびに新しい String クラスが作成されている点に注意しましょう。