public final class Matcher extends Object implements MatchResult
Pattern
を解釈することによって、
文字シーケンス
のマッチ操作を行うエンジンです。
正規表現エンジンは、パターンの matcher
メソッドを呼び出すことによって作成されます。一度作成すると、次の 3 種類のマッチ操作に使用できます。
matches
メソッドは、入力シーケンス全体とパターンをマッチする。
lookingAt
メソッドは、入力シーケンスの先頭から始めてパターンをマッチする。
find
メソッドは、入力シーケンスを走査して、パターンとマッチする次の部分シーケンスを検索する。
これらのメソッドは、マッチが成功したかどうかを示す boolean 値を返します。マッチが成功したときは、正規表現エンジンの状態を照会すれば詳細を取得できます。
正規検索エンジンは領域と呼ばれる入力のサブセットでマッチを検索します。デフォルトでは、領域には正規検索エンジンの入力すべてが含まれます。領域を変更するには、region
メソッドを使用し、照会するには、regionStart
メソッドおよび regionEnd
メソッドを使用します。領域の境界による一定のパターン作成の方法は変更できます。詳細は、useAnchoringBounds
および useTransparentBounds
を参照してください。
このクラスには、マッチした部分シーケンスを新しい文字列に置換するメソッドも定義します。新しい文字列の内容は、必要に応じてマッチ結果から算出できます。appendReplacement
および appendTail
メソッドを同時に使用すれば、マッチ結果を収集して既存の文字列バッファーに格納できます。また、replaceAll
メソッドを使用すれば、入力シーケンス内でマッチした部分シーケンスがすべて置換された文字列を作成できます。
正規表現エンジンの明示的な状態として、最後に成功したマッチの開始インデックスと終了インデックスがあります。また、パターンの各前方参照を行う正規表現グループによって前方参照された入力部分シーケンスの開始インデックスと終了インデックスや、前方参照された部分シーケンスの総数も利用されます。前方参照された部分シーケンスを文字列形式で返すメソッドも用意されています。
正規表現エンジンの明示的な状態の初期値は定義されていません。マッチが成功する前にその一部を照会しようとすると、IllegalStateException
がスローされます。正規表現エンジンの明示的な状態は、マッチ操作のたびに計算し直されます。
正規表現エンジンの暗黙的な状態には、入力文字シーケンスや追加位置があります。追加位置の初期値はゼロで、appendReplacement
メソッドによって更新されます。
正規表現エンジンをリセットするには、正規表現エンジンの reset()
メソッドまたは reset(CharSequence)
メソッド (新しい入力シーケンスが必要な場合) を呼び出します。正規表現エンジンをリセットすると、その明示的な状態に関する情報が破棄され、追加位置がゼロに設定されます。
このクラスのインスタンスは、複数のスレッドで並行して使用することはできません。
修飾子と型 | メソッドと説明 |
---|---|
Matcher |
appendReplacement(StringBuffer sb, String replacement)
継続追加置換手順を実装します。
|
StringBuffer |
appendTail(StringBuffer sb)
終了追加置換手順を実装します。
|
int |
end()
最後にマッチした文字の後のオフセットを返します。
|
int |
end(int group)
前回のマッチ操作で指定されたグループによって前方参照された部分シーケンスの、最終文字の後のオフセットを返します。
|
boolean |
find()
入力シーケンスからこのパターンとマッチする次の部分シーケンスを検索します。
|
boolean |
find(int start)
この正規表現エンジンをリセットし、指定されたインデックス以降の入力シーケンスから、このパターンとマッチする次の部分シーケンスを検索します。
|
String |
group()
前回のマッチで一致した入力部分シーケンスを返します。
|
String |
group(int group)
前回のマッチ操作で指定されたグループによって前方参照された入力部分シーケンスを返します。
|
String |
group(String name)
前回のマッチ操作で指定された名前付きの前方参照を行うグループによって前方参照された入力部分シーケンスを返します。
|
int |
groupCount()
この正規表現エンジンのパターンに指定されている前方参照を行う正規表現グループの数を返します。
|
boolean |
hasAnchoringBounds()
この正規表現エンジンの領域境界のアンカー設定を問い合わせるクエリーを出します。
|
boolean |
hasTransparentBounds()
この正規表現エンジンの領域境界の透明度を問い合わせるクエリーを出します。
|
boolean |
hitEnd()
この正規検索エンジンが実行した最後のマッチ操作で、入力の末尾が検索エンジンによりヒットした場合に、true を返します。
|
boolean |
lookingAt()
入力シーケンスとパターンとのマッチを、領域の先頭から始めます。
|
boolean |
matches()
領域全体をこのパターンとマッチします。
|
Pattern |
pattern()
この正規表現エンジンによって解釈されるパターンを返します。
|
static String |
quoteReplacement(String s)
指定された
String のリテラル置換 String を返します。 |
Matcher |
region(int start, int end)
正規検索エンジンの領域に制限を設定します。
|
int |
regionEnd()
この正規検索エンジンの領域の終了インデックス (その値を含まない) をレポートします。
|
int |
regionStart()
この正規検索エンジンの領域の開始インデックスをレポートします。
|
String |
replaceAll(String replacement)
パターンとマッチする入力シーケンスの部分シーケンスを、指定された置換文字列に置き換えます。
|
String |
replaceFirst(String replacement)
パターンとマッチする入力シーケンスの部分シーケンスのうち、最初の部分シーケンスを指定された置換文字列に置き換えます。
|
boolean |
requireEnd()
より多くの入力で正のマッチが負のマッチに変更される可能性がある場合に、true を返します。
|
Matcher |
reset()
この正規表現エンジンをリセットします。
|
Matcher |
reset(CharSequence input)
新しい入力シーケンスを使用してこの正規表現エンジンをリセットします。
|
int |
start()
前回のマッチの開始インデックスを返します。
|
int |
start(int group)
前回のマッチ操作で指定されたグループによって前方参照された部分シーケンスの、開始インデックスを返します。
|
MatchResult |
toMatchResult()
このマッチャーのマッチ状態を
MatchResult として返します。 |
String |
toString()
この正規表現エンジンの文字列表現を返します。
|
Matcher |
useAnchoringBounds(boolean b)
この正規表現エンジンの領域境界のアンカーを設定します。
|
Matcher |
usePattern(Pattern newPattern)
この Matcher がマッチ検索に使用する Pattern を変更します。
|
Matcher |
useTransparentBounds(boolean b)
この正規表現エンジンの領域境界の透明度を設定します。
|
public Pattern pattern()
public MatchResult toMatchResult()
MatchResult
として返します。結果は、この正規検索エンジンに対する後続の操作の影響を受けません。MatchResult
public Matcher usePattern(Pattern newPattern)
このメソッドを使用すると、最後に発生したマッチのグループに関する情報がこの正規表現エンジンから失われます。入力内の正規表現エンジンの位置は維持され、最後の追加位置は影響を受けません。
newPattern
- この正規表現エンジンが使用する新規パターンIllegalArgumentException
- newPattern が null である場合public Matcher reset()
正規検索エンジンをリセットすると、明示的な状態情報すべてが破棄され、追加位置がゼロに設定されます。正規検索エンジンの領域は、デフォルトである文字シーケンス全体に設定されます。この正規表現エンジンの領域境界のアンカーおよび透明度は影響を受けません。
public Matcher reset(CharSequence input)
正規検索エンジンをリセットすると、明示的な状態情報すべてが破棄され、追加位置がゼロに設定されます。正規検索エンジンの領域は、デフォルトである文字シーケンス全体に設定されます。この正規表現エンジンの領域境界のアンカーおよび透明度は影響を受けません。
input
- 新しい入力文字シーケンスpublic int start()
start
、インタフェース: MatchResult
IllegalStateException
- マッチがまだ試みられていない場合、または前回のマッチ操作が失敗した場合public int start(int group)
前方参照を行う正規表現グループには、左から右方向に 1 からインデックスが付きます。グループ 0 はパターン全体を表します。つまり、m.start(0) と m.start() は同じ表現です。
start
、インタフェース: MatchResult
group
- この正規表現エンジンのパターンに指定されている前方参照を行う正規表現グループのインデックスIllegalStateException
- マッチがまだ試みられていない場合、または前回のマッチ操作が失敗した場合IndexOutOfBoundsException
- 指定されたインデックスを持つ前方参照を行う正規表現グループがそのパターンに含まれない場合public int end()
end
、インタフェース: MatchResult
IllegalStateException
- マッチがまだ試みられていない場合、または前回のマッチ操作が失敗した場合public int end(int group)
前方参照を行う正規表現グループには、左から右方向に 1 からインデックスが付きます。グループ 0 はパターン全体を表します。つまり、m.end(0) と m.end() は同じ表現です。
end
、インタフェース: MatchResult
group
- この正規表現エンジンのパターンに指定されている前方参照を行う正規表現グループのインデックスIllegalStateException
- マッチがまだ試みられていない場合、または前回のマッチ操作が失敗した場合IndexOutOfBoundsException
- 指定されたインデックスを持つ前方参照を行う正規表現グループがそのパターンに含まれない場合public String group()
入力シーケンス s のマッチャー m の場合、m.group() と s.substring(m.start(), m.end()) は同じ表現です。
パターン (a* など) によっては、空の文字列とマッチすることがあります。これらのパターンが入力シーケンス内の空の文字列とマッチした場合、空の文字列が返されます。
group
、インタフェース: MatchResult
IllegalStateException
- マッチがまだ試みられていない場合、または前回のマッチ操作が失敗した場合public String group(int group)
マッチャー m、入力シーケンス s、およびグループインデックス g の場合、m.group(g) と s.substring(m.start(g), m.end(g)) は同じ表現です。
前方参照を行う正規表現グループには、左から右方向に 1 からインデックスが付きます。グループ 0 はパターン全体を表します。つまり、m.group(0) と m.group() は同じ表現です。
マッチは正常終了したが、指定されたグループが入力シーケンスに検出されなかった場合、null が返されます。パターン ((a*) など) によっては、空の文字列とマッチすることがあります。これらのグループが入力シーケンス内の空の文字列とマッチした場合、空の文字列が返されます。
group
、インタフェース: MatchResult
group
- この正規表現エンジンのパターンに指定されている前方参照を行う正規表現グループのインデックスIllegalStateException
- マッチがまだ試みられていない場合、または前回のマッチ操作が失敗した場合IndexOutOfBoundsException
- 指定されたインデックスを持つ前方参照を行う正規表現グループがそのパターンに含まれない場合public String group(String name)
マッチは正常終了したが、指定されたグループが入力シーケンスに検出されなかった場合、null が返されます。パターン ((a*) など) によっては、空の文字列とマッチすることがあります。これらのグループが入力シーケンス内の空の文字列とマッチした場合、空の文字列が返されます。
name
- この正規表現エンジンのパターンに指定されている名前付きの前方参照を行う正規表現グループの名前IllegalStateException
- マッチがまだ試みられていない場合、または前回のマッチ操作が失敗した場合IllegalArgumentException
- 指定された名前を持つ前方参照を行う正規表現グループがそのパターンに含まれない場合public int groupCount()
グループ 0 はパターン全体を表します。これは、このカウントに含まれません。
グループインデックスがこのメソッドから返された値以下の正の整数である場合は、この正規表現エンジンで有効です。
groupCount
、インタフェース: MatchResult
public boolean matches()
マッチが成功した場合は、start、end、および group メソッドを使用して詳細情報を取得できます。
public boolean find()
このメソッドは、正規検索エンジンの領域の先頭から開始されます。ただし、前回の呼び出しが正常に終了してから正規表現エンジンがリセットされていない場合は、前回のマッチで一致しなかった最初の文字から開始されます。
マッチが成功した場合は、start、end、および group メソッドを使用して詳細情報を取得できます。
public boolean find(int start)
マッチが成功した場合は、start、end、および group メソッドを使用して詳細情報を取得できます。後続の find()
メソッド呼び出しでは、このマッチで一致しなかった最初の文字から開始されます。
IndexOutOfBoundsException
- start がゼロより小さい場合、または start が入力シーケンスの長さより大きい場合。public boolean lookingAt()
matches
メソッドと同様に、領域の先頭から開始されます。ただし、領域全体がマッチする必要はありません。
マッチが成功した場合は、start、end、および group メソッドを使用して詳細情報を取得できます。
public static String quoteReplacement(String s)
String
のリテラル置換 String
を返します。
このメソッドは、Matcher
クラスの appendReplacement
メソッド内のリテラル置換 s
として機能する String
を生成します。生成される String
は、リテラルシーケンスとして処理される s
内の文字シーケンスにマッチします。スラッシュ ('\') およびドル記号 ('$') には特別な意味はありません。s
- リテラル化する文字列public Matcher appendReplacement(StringBuffer sb, String replacement)
このメソッドは、次の処理を実行します。
追加位置以降の入力シーケンスから文字列を読み込み、指定された文字列バッファーに追加する。前回マッチした文字の直前の文字、つまりインデックス start()
- 1 の文字を読み込んだときに終了する。
指定された置換文字列を文字列バッファーに追加する。
この正規表現エンジンの追加位置を、最後にマッチした文字のインデックスに 1 を加えた値、つまり end()
に設定する。
置換文字列には、前回のマッチ時に前方参照された部分シーケンスへの参照が含まれる場合があります。${name} または $g が検出されると、対応する group(name)
または group(g)
をそれぞれ評価した結果にすべて置換されます。$g の場合、$ の後の最初の数値は、常にグループ参照の一部として処理されます。後続の数値が正当なグループ参照を構成する場合、これらは g に組み込まれます。数 0 - 9 だけが、グループ参照の潜在的なコンポーネントと見なされます。たとえば、2 番目のグループが文字列「foo」にマッチすると、置換文字列「$2bar」の引き渡しが行われて、「foobar」が文字列バッファーに追加されます。前にバックスラッシュ (\$) を付けることで、ドル記号 ($) をリテラルとして置換文字列に含めることができます。
置換文字列内でバックスラッシュ (\) とドル記号 ($) を使用すると、それをリテラル置換文字列として処理した場合とは結果が異なる場合があります。ドル記号は、先に説明したとおり、前方参照された部分シーケンスへの参照として処理される場合があり、バックスラッシュは置換文字列内のリテラル文字をエスケープするのに使用されます。
このメソッドは、ループ内で appendTail
メソッドおよび find
メソッドと組み合わせて使用します。たとえば、次のコードでは、one dog two dogs in the yard を標準出力ストリームに書き出します。
Pattern p = Pattern.compile("cat"); Matcher m = p.matcher("one cat two cats in the yard"); StringBuffer sb = new StringBuffer(); while (m.find()) { m.appendReplacement(sb, "dog"); } m.appendTail(sb); System.out.println(sb.toString());
sb
- ターゲット文字列バッファーreplacement
- 置換文字列IllegalStateException
- マッチがまだ試みられていない場合、または前回のマッチ操作が失敗した場合IllegalArgumentException
- 置換文字列が参照している名前付きの前方参照を行う正規表現グループが、パターン内に存在しない場合IndexOutOfBoundsException
- 置換文字列が参照している前方参照を行う正規表現グループが、パターン内に存在しない場合public StringBuffer appendTail(StringBuffer sb)
このメソッドは、追加位置以降の入力シーケンスから文字列を読み込み、指定された文字列バッファーに追加します。入力シーケンスの残りの部分をコピーするために、appendReplacement
メソッドを 1 回以上呼び出してからこのメソッドを呼び出します。
sb
- ターゲット文字列バッファーpublic String replaceAll(String replacement)
このメソッドはまず、この正規表現エンジンをリセットします。次に、入力シーケンスを走査して、パターンとマッチする文字列を検索します。パターンとマッチしない文字列は、結果文字列に直接追加されます。パターンとマッチした文字列は、置換文字列に置換されて結果に追加されます。appendReplacement
} メソッドと同様に、前方参照された部分シーケンスへの参照が置換文字列に含まれる場合があります。
置換文字列内でバックスラッシュ (\) とドル記号 ($) を使用すると、それをリテラル置換文字列として処理した場合とは結果が異なる場合があります。ドル記号は、先に説明したとおり、前方参照された部分シーケンスへの参照として処理される場合があり、バックスラッシュは置換文字列内のリテラル文字をエスケープするのに使用されます。
正規表現 a*b、入力「aabfooaabfooabfoob」、および置換文字列「-」を指定した場合、その表現の正規表現エンジン上でこのメソッドを呼び出すと、文字列「-foo-foo-foo-」が生成されます。
このメソッドを呼び出すと、この正規表現エンジンの状態が変わります。この正規表現エンジンを後続のマッチ操作で使用する場合は、最初に正規表現エンジンをリセットする必要があります。
replacement
- 置換文字列public String replaceFirst(String replacement)
このメソッドはまず、この正規表現エンジンをリセットします。次に、入力シーケンスを走査して、パターンとマッチする最初の文字列を検索します。パターンとマッチしない文字列は、結果文字列に直接追加されます。パターンとマッチした文字列は、置換文字列に置換されて結果に追加されます。appendReplacement
} メソッドと同様に、前方参照された部分シーケンスへの参照が置換文字列に含まれる場合があります。
置換文字列内でバックスラッシュ (\) とドル記号 ($) を使用すると、それをリテラル置換文字列として処理した場合とは結果が異なる場合があります。ドル記号は、先に説明したとおり、前方参照された部分シーケンスへの参照として処理される場合があり、バックスラッシュは置換文字列内のリテラル文字をエスケープするのに使用されます。
正規表現 dog、入力「zzzdogzzzdogzzz」、および置換文字列「cat」を指定した場合、その表現の正規表現エンジン上でこのメソッドを呼び出すと、文字列「zzzcatzzzdogzzz」が生成されます。
このメソッドを呼び出すと、この正規表現エンジンの状態が変わります。この正規表現エンジンを後続のマッチ操作で使用する場合は、最初に正規表現エンジンをリセットする必要があります。
replacement
- 置換文字列public Matcher region(int start, int end)
start
パラメータにより指定されたインデックスに、領域の末尾が end
パラメータにより指定されたインデックスにそれぞれ設定されます。
使用される透明度とアンカー設定によっては (useTransparentBounds
および useAnchoringBounds
を参照)、アンカーなどの特定の作成上の振る舞いが領域の境界またはその付近で異なる場合があります。
start
- 検索を開始する位置のインデックス (その値も含む)end
- 検索を終了する位置のインデックス (その値を含まない)IndexOutOfBoundsException
- start または end がゼロより小さい場合、start が入力シーケンスの長さより大きい場合、end が入力シーケンスの長さより大きい場合、または start が end より大きい場合。public int regionStart()
regionStart
(その値も含む) と regionEnd
(その値を含まない) の内部でのマッチ検索に制限されます。public int regionEnd()
regionStart
(その値も含む) と regionEnd
(その値を含まない) の内部でのマッチ検索に制限されます。public boolean hasTransparentBounds()
このメソッドは、transparent 境界がこの正規表現エンジンで使用される場合は true を返し、opaque 境界が使用される場合には false を返します。
透明または不透明の境界の詳細については、useTransparentBounds
を参照してください。
デフォルトでは、正規表現エンジンは不透明の領域境界を使用します。
useTransparentBounds(boolean)
public Matcher useTransparentBounds(boolean b)
このメソッドに true の引数を指定して呼び出すと、透明な境界がこの正規表現エンジンで使用されます。boolean 引数が false の場合は、不透明な境界が使用されます。
透明な境界を使用する場合、この正規表現エンジンの領域は、前方、後方、および境界のマッチング作成で透明になります。これらの作成は、マッチが適切かどうかを領域の境界を超えて見ることができます。
不透明な境界を使用すると、この正規表現エンジンの境界は、前方、後方、および境界を超えて検索を試みるマッチング作成で不透明となります。これらの作成では境界を以前にさかのぼって検索できないため、領域外ではどのようなマッチングも失敗します。
デフォルトでは、正規表現エンジンは不透明の境界を使用します。
b
- 不透明または透明の領域のどちらを使用するかを示す booleanhasTransparentBounds()
public boolean hasAnchoringBounds()
このメソッドは、アンカー設定境界がこの正規表現エンジンで使用される場合は true を返し、そうでない場合は false を返します。
アンカー設定境界の詳細については、useAnchoringBounds
を参照してください。
デフォルトでは、正規表現エンジンはアンカー設定領域境界を使用します。
useAnchoringBounds(boolean)
public Matcher useAnchoringBounds(boolean b)
このメソッドに true の引数を指定して呼び出すと、アンカー設定境界がこの正規表現エンジンで使用されます。boolean 引数が false の場合は、アンカー設定されない境界が使用されます。
アンカー設定境界が使用されると、この正規表現エンジンの領域の境界は、^ および $ などのアンカーにマッチします。
アンカー設定境界が使用されない場合は、この正規表現エンジンの領域の境界は、^ および $ などのアンカーにマッチしません。
デフォルトでは、正規表現エンジンはアンカー設定領域境界を使用します。
b
- アンカー設定境界を使用するかどうかを示す boolean。hasAnchoringBounds()
public String toString()
この正規表現エンジンの文字列表現を返します。Matcher
の文字列表現には、デバッグに有用な情報が含まれます。厳密な書式は指定されません。
public boolean hitEnd()
この正規検索エンジンが実行した最後のマッチ操作で、入力の末尾が検索エンジンによりヒットした場合に、true を返します。
このメソッドが true を返す場合、入力がさらに多ければ、最後の検索の結果が変更された可能性があります。
public boolean requireEnd()
より多くの入力で正のマッチが負のマッチに変更される可能性がある場合に、true を返します。
このメソッドが true を返し、かつマッチが検出された場合、より多くの入力があればマッチが失われた可能性があります。このメソッドが false を返し、かつマッチが検出された場合、より多くの入力があればマッチは変更されるが、失われることはなかった可能性があります。マッチが検出されなかった場合、requireEnd に意味はありません。
バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.