正規表現の手始め

正規表現を使う事で文字列を処理するコードの量を劇的に減らす事ができます。具体的な用途としては、文字列の検証や検索などに使います。単純な文字列の合致だけならそんなのは必要ないんですけど、複数のルールに合致していないといけない場合などは重宝します。
grepとかでファイルの中身を検証する時もありますが、ちょっとしたものなら正規表現を作ってサンプルプログラムをperlなんかで書いてやるのが手始めにいいかもしれません。僕のそこから正規表現について勉強し始めました。
以下にサンプルプログラムと正規表現のお作法を書いてみました。

  • 処理内容

与えられた文字列がメールアドレスとみなせるかを判定する処理。
(1)@がある事
(2)英数字、アンダースコア、ピリオド、ハイフンで構成される事。
(3)@の後ろは英数字とハイフンで文字列を構成しピリオドをつけたものを1回以上繰り返している事
(4)末尾は2-4文字の英数字

  • サンプルプログラム
import java.util.regex.Pattern;

public static void main (String[] args)
{
  Pattern pat_email = Pattern.compile("^[a-z0-9_.-]+@([[a-z0-9_.-]+\\.)+[a-z]{2,4}$");
  if(pat_email.matcher(args[0].find())
  {
    System.out.println("Matched!!");
  }
  else
  {
    System.out.println("Try Again!!");
  }
}
  • 詳細説明
記号 意味
[] 正規表現の文字クラスを呼ぶ
^ 行の先頭
a-z0-9 英数字
_.- アンダースコアとドットとハイフン
+ 直前にある文字か文字クラスを1回以上繰り返す事を意味する。この場合だと英数字と_.-のいずれかを数回繰り返す事を意味する。他に「?」「*」「」も繰り返しの回数を指定できる
() 複数の正規表現の組み合わせを一つにまとめる
\\. 「.」だけだと任意の1文字となるので、条件の中に「.」を入れる場合には「\.」とする必要がある。javaではさらに「\\」は「\」と解釈されます
[a-z]{2,4} 英数字が2文字以上4文字以内
* 直前の文字か文字クラスを0回以上繰り返す事を意味する。
? 直前の文字か文字クラスが0回か1回
$ 行末
: :の前後に指定された文字か文字クラスのいずれかにマッチ
\s 空白文字
\S 空白文字以外
\w アルファベットまたは数字のいずれかの文字
\W アルファベットまたは数字のいずれでもない文字


正規表現 - Wikipedia