Javaにおいて、ある文字列と文字列の一致を確かめるには、Stringクラスに定義されているequals()メソッドを使います。
しかし、それは文字列同士の完全一致の判定しか行う事ができません。
では文字列の部分一致、例えば ”h” から始まる文字列を調べるには、どのようにしたらよいでしょうか。
一言で ”h” から始まる文字列といっても “hello”, ”happy”, ”hot”, ”honey”, ”hawaii” …のように数多く存在します。
その条件、今回でいうところの『 ”h” から始まる文字列』を一つのパターンとし、それを表現する方法が正規表現です。
正規表現の使用方法
正規表現で『 ”h” から始まる文字列』を表すと、 ”h.*” のようになります。
ここで使用されている ”.” や ”*” はメタ文字と呼ばれるもので、プログラムの中で特別な意味を持った文字のことです。
例えば ”.” は、任意の一文字を表しています。アルファベットや数字、ひらがな漢字カタカナなど何らかの文字という表現になります。
そして続く ”*” は、直前の表現の0回以上の繰り返しを表します。こちらは ”*” の前に書かれたもの、今回で言うところの ”.” の繰り返しが0回以上続く、つまり ”h.*” という表現では、 ”h” の後に何らかの文字が0回以上続く文字を表しています。
これにより ”h.*” は ”hello” や ”happy”、極端にいえば ”h” 一文字だけという文字列も表現する事ができるのです。
この正規表現を使って文字の部分一致を判定する事を、「文字列のパターンに一致する」「パターンにマッチする」等と言います。
では、先程の例文字列 ”h.*” 一致するコードに表してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[java firstline="5"] String str = "hello"; String regex = "h.*"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(str); if (matcher.find()){ System.out.println("パターンにマッチしました"); System.out.println(matcher.group()); }else{ System.out.println("パターンにマッチしませんでした"); } [/java] |
コードの解説です。
まず1行目で、文字列 ”hello” を変数strに格納しています。Patternオブジェクトのcompile()メソッドの引数に、正規表現を表す文字列パターンregexを渡して、正規表現を保持するPatternクラスのオブジェクトを生成しています。
4行目にPatternオブジェクトのmatcher()メソッドの引数に、判定対象となる文字列strを渡してマッチングしています。ここで引数に渡された文字列が正規表現パターンとマッチしていたら、Matcherオブジェクトとして取得されます。
6行目のif文の条件でMatcherオブジェクトのfind()メソッドが呼び出されています。
find()メソッドは、マッチした文字列があればtrueを、マッチした文字列が無ければfalseを返します。
8行目では、マッチした文字列の取得を行っています。
このように正規表現をJavaプログラム内で使用できる形式に変換するPatternクラス、指定されたパターンを使ってターゲットの文字列に対して様々な操作を行うMatcherクラスのメソッドを使い、特定の文字の正規表現を行う事が出来ます。
これらを使い名前の一致やURL、E-mailアドレスのパターンを表現し、文字列検索や文字の置き換えなどを行っていく事が可能になるのです。
その他の代表的なメタ文字例
+ | 直前の表現1回以上の繰り返しにマッチする。 |
---|---|
? | 直前の表現0回か1回にマッチする。 |
^ | 行頭にマッチする。 [ ]の中で使用した場合には、「以外」という意味になる。 |
$ | 行末にマッチする。 |
| | orの意味になり、この文字の左か右の文字にマッチする。 |
{ } | 直前の表現の繰り返し回数を表す。{n}はn回、{n,}はn回以上、{n,m}はn回以上m回以下の繰り返しにマッチする。 |
[ ] | [ ]内の1文字にマッチする。 |
( ) | 表現内でのグループを作る。また、マッチした値を順番に取り出すことができる。 |
\ | メタ文字を単なる普通の文字とし検索したい場合、メタ文字の前にこの記号を前に付けることで、メタ文字としての機能を打ち消し、表示不可能な文字や特定の意味を持った文字の集合にマッチする。 例:”\+”,”\?” など |
また、Javaでは “\” をエスケープ(特殊な記号の前に記述して後に続く文字を認識させるための記号)として利用することがあります。 “\” を用いた正規表現での特殊文字についても確認しておきましょう。
\c{x} | CTRL-“x”に該当するコントロール文字にマッチします。 xは大文字のXでも構いません。 |
---|---|
\f | フォームフィードにマッチします。 |
\n | ラインフィード(改行コード)にマッチします。 |
\r | キャリッジリターン(改行コード)にマッチします。 |
\s | ホワイトスペース(空白・ラインフィード・キャリッジリターン・タブ・垂直タブなど)にマッチします。(”[\f\n\r\t\v]”とした場合と同じです。) |
\S | ホワイトスペース以外の文字にマッチします。(”[^\f\n\r\t\v]”とした場合と同じです) |
\t | タブにマッチします。 |
\v | 垂直タブにマッチします。 |
\x{n} | 文字コード”n”で表される文字1文字にマッチします。(”\x20”はスペースになります。) |
なお、ここでご紹介したものはほんの一部です。
気になったパターンがあったら”正規表現 パターン”等で検索をかけてみましょう。