透過境界フラグの設定

広告

リージョンを設定すると、ターゲット文字列の中でマッチするかどうかの対象となる範囲が設定されるため、範囲の前や後の部分は見ることができません。

次の例を見てください。

border color is red

上記のターゲット文字列に対し、パターン"¥br.."がマッチするの"red"です。このパターンは単語の境界の位置から"r"に続いて2つの文字が現れる場合にマッチするからです。

では先ほどのターゲット文字列に、リージョンを(2, 19)に設定します。すると対象となる文字列は次のようになります。

rder color is red

今度はパターン"¥br.."がマッチするのは"rde"となります。リージョンの設定によって"rder"が単語の途中の文字列ではなく単語の先頭のように見えるからです。(単語の境界は行頭と最初の文字の間にマッチします)。

以上がデフォルトの動作なのですが、リージョンを設定してもその領域の前や後の部分を調べることができるようにするにはMatcherクラスで定義されているuseTransparentBoundsメソッドを使用します。

この正規表現エンジンの領域境界の透明度を設定します。

このメソッドに true の引数を指定して呼び出すと、transparent 境界がこの正規表現エンジンで
使用されます。boolean 引数が false の場合は、opaque 境界が使用されます。

透明な境界を使用する場合、この正規表現エンジンの領域は、前方、後方、および境界のマッチン
グ作成で透明になります。これらの作成は、マッチが適切かどうかを領域の境界を超えて見ること
ができます。

不透明な境界を使用すると、この正規表現エンジンの境界は、前方、後方、および境界を超えて検
索を試みるマッチング作成で不透明となります。これらの作成では境界を以前にさかのぼって検索
できないため、領域外ではいかなるマッチングも失敗します。

デフォルトでは、正規表現エンジンは不透明の境界を使用します。

パラメータ:
  b - 不透明または透明の領域のどちらを使用するかを示す boolean 
戻り値:
  この正規表現エンジン

引数にtrueを設定すると、リージョンを設定してもその範囲を超えてマッチが適切かどうかを調べるようになります。デフォルトはfalseとなっています。

先ほどの単語の境界を調べる場合の他に、先読みや後読みなどで有効となります。

なお、現在の設定を取得するにはMatcherクラスで定義されているhasTransparentBoundsメソッドを使用します。

public boolean hasTransparentBounds()
この正規表現エンジンの領域境界の透明度を問い合わせるクエリーを出します。

このメソッドは、transparent 境界がこの正規表現エンジンで使用される場合は true を返し、
opaque 境界が使用される場合には false を返します。

透明または不透明の境界の詳細については、useTransparentBounds を参照してください。

デフォルトでは、正規表現エンジンは不透明の領域境界を使用します。

戻り値:
  この正規表現エンジンが透明な境界を使用する場合は true、そうでない場合は false

メソッドを実行すると、現在の設定をboolean型の値として返します。

サンプルプログラム

では実際に試してみます。

JSample4_1.java

import java.util.regex.Pattern;
import java.util.regex.Matcher;

class JSample4_1{
  public static void main(String args[]){
    String str = "Black label.";

    String regex = "¥¥bla.+?¥¥b";
    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 = 1;
    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.useTransparentBounds(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("×");
    }
  }
}

ではコンパイルを行った上で実行してみます。

p4-1

( Written by Tatsuo Ikura )