Aritalab:Lecture/Programming/Java/Grep

From Metabolomics.JP
< Aritalab:Lecture | Programming | Java
Revision as of 11:55, 7 May 2012 by Adm (Talk | contribs)

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

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

Personal tools
Namespaces

Variants
Actions
Navigation
metabolites
Toolbox