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)
前回のマッチ操作で指定されたグループによって前方参照された部分シーケンスの、最終文字の後のオフセットを返します。
|
int |
end(String name)
前回のマッチ操作で、指定された名前付きの前方参照を行う正規表現グループによって前方参照された部分シーケンスの、最後の文字の後のオフセットを返します。
|
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)
前回のマッチ操作で指定されたグループによって前方参照された部分シーケンスの、開始インデックスを返します。
|
int |
start(String name)
前回のマッチ操作で指定された名前付き前方参照グループによって前方参照された部分シーケンスの開始インデックスを返します。
|
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 start(String name)
name
- この正規表現エンジンのパターンに指定されている名前付きの前方参照を行う正規表現グループの名前-1
IllegalStateException
- マッチがまだ試みられていない場合、または前回のマッチ操作が失敗した場合IllegalArgumentException
- 指定された名前を持つ前方参照を行う正規表現グループがそのパターンに含まれない場合public int end()
end
、インタフェース: MatchResult
IllegalStateException
- マッチがまだ試みられていない場合、または前回のマッチ操作が失敗した場合public int end(int group)
前方参照を行う正規表現グループは、左から右に1からインデックス付けされます。グループ0はパターン全体を表します。つまり、m.end(0)とm.end()は同じ表現です。
end
、インタフェース: MatchResult
group
- この正規表現エンジンのパターンに指定されている前方参照を行う正規表現グループのインデックスIllegalStateException
- マッチがまだ試みられていない場合、または前回のマッチ操作が失敗した場合IndexOutOfBoundsException
- 指定されたインデックスを持つ前方参照を行う正規表現グループがそのパターンに含まれない場合public int end(String name)
name
- この正規表現エンジンのパターンに指定されている名前付きの前方参照を行う正規表現グループの名前-1
IllegalStateException
- マッチがまだ試みられていない場合、または前回のマッチ操作が失敗した場合IllegalArgumentException
- 指定された名前を持つ前方参照を行う正規表現グループがそのパターンに含まれない場合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()
メソッド呼出しでは、このマッチで一致しなかった最初の文字から開始されます。
start
- マッチの検索を開始するインデックス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, 2014, Oracle and/or its affiliates. All rights reserved.