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 クラスが作成されている点に注意しましょう。