- Home ›
- Java正規表現の使い方 ›
- リージョン ›
- HERE
アンカー境界フラグの設定
リージョンを設定すると、ターゲット文字列の中でマッチするかどうかの対象となる範囲が設定されますが、指定した範囲の文字列に対して行の先頭や行の末尾が存在するように見なされます。
次の例を見てください。
border color is red
上記のターゲット文字列に対し、パターン"^color"はマッチしません。このパターンは行の先頭の位置から"color"が現れる場合にマッチするからです。
では先ほどのターゲット文字列に、リージョンを(7, 15)に設定します。すると対象となる文字列は次のようになります。
color is
今度はパターン"^color"はマッチします。リージョンの設定によってあたかもターゲット文字列の行の先頭が"color"から始まっているように見えるからです。
以上がデフォルトの動作なのですが、リージョンを設定したことによる境界が行頭や行末としてマッチさせたくない場合はMatcherクラスで定義されているuseAnchoringBoundsメソッドを使用します。
useAnchoringBounds public Matcher useAnchoringBounds(boolean b)
この正規表現エンジンの領域境界のアンカーを設定します。 このメソッドに true の引数を指定して呼び出すと、anchoring 境界がこの正規表現エンジンで使 用されます。boolean 引数が false の場合は、non-anchoring 境界が使用されます。 アンカー設定境界が使用されると、この正規表現エンジンの領域の境界は、 ^ および $ などのア ンカーにマッチします。 アンカー設定境界が使用されない場合は、この正規表現エンジンの領域の境界は、 ^ および $ な どのアンカーにマッチしません。 デフォルトでは、正規表現エンジンはアンカー設定領域境界を使用します。 パラメータ: b - アンカー設定境界を使用するかどうかを示す boolean 戻り値: この正規表現エンジン
引数にfalseを設定すると、リージョンを設定しても行の先頭や行の末尾は元々のターゲット文字列のままとなります。デフォルトはtrueとなっています。
リージョンの設定を行っても行の先頭や文字列の先頭などの扱いは元のままにしたい場合にfalseを設定して下さい。
なお、現在の設定を取得するにはMatcherクラスで定義されているhasAnchoringBoundsメソッドを使用します。
hasAnchoringBounds public boolean hasAnchoringBounds()
この正規表現エンジンの領域境界のアンカー設定を問い合わせるクエリーを出します。 このメソッドは、anchoring 境界がこの正規表現エンジンで使用される場合は true を返し、そう でない場合は false を返します。 アンカー設定境界の詳細については、 useTransparentBounds を参照してください。 デフォルトでは、正規表現エンジンはアンカー設定領域境界を使用します。 戻り値: この正規表現エンジンがアンカー設定境界を使用する場合は true、そうでない場合は false
メソッドを実行すると、現在の設定をboolean型の値として返します。
サンプルプログラム
では実際に試してみます。
import java.util.regex.Pattern; import java.util.regex.Matcher; class JSample3_1{ public static void main(String args[]){ String str = "Blackcolor is dark color."; String regex = "^color"; Pattern p = Pattern.compile(regex); System.out.println("パターン : " + regex); System.out.println("ターゲット文字列 : ¥"" + str + "¥""); Matcher m = p.matcher(str); int start = m.regionStart(); int end = m.regionEnd(); System.out.println("¥nデフォルトのままマッチ:"); System.out.println("region : ¥"" + str.substring(start, end) + "¥""); if (m.find()){ System.out.println("match:" + m.group()); }else{ System.out.println("×"); } start = 5; m.region(start, end); System.out.println("¥nリージョンを(" + start + "," + end + ")に設定:"); System.out.println("region : ¥"" + str.substring(start, end) + "¥""); if (m.find()){ System.out.println("match:" + m.group()); }else{ System.out.println("×"); } m.useAnchoringBounds(false); System.out.println("¥nアンカー境界フラグを false に設定:"); System.out.println("region : ¥"" + str.substring(start, end) + "¥""); if (m.find()){ System.out.println("match:" + m.group()); }else{ System.out.println("×"); } } }
ではコンパイルを行った上で実行してみます。
( Written by Tatsuo Ikura )