JavaTM Platform
Standard Ed. 6

java.util.regex
クラス Pattern

java.lang.Object
  上位を拡張 java.util.regex.Pattern
すべての実装されたインタフェース:
Serializable

public final class Pattern
extends Object
implements Serializable

コンパイル済みの正規表現です。  

正規表現は、文字列として指定し、このクラスのインスタンスにコンパイルする必要があります。結果として得られるパターンは、Matcher オブジェクトを作成するために使用されます。 このオブジェクトは、任意の 文字シーケンス とこの正規表現をマッチできます。マッチを実行したときの状態はすべて正規表現エンジンに格納されます。 このため、複数の正規表現エンジンが同じパターンを共有できます。  

標準的な呼び出しシーケンスは、次のようになります。

 Pattern p = Pattern.compile("a*b");
 Matcher m = p.matcher("aaaaab");
 boolean b = m.matches();
 

このクラスに定義した matches メソッドを使用すれば、正規表現は一度使用するだけで済みます。このメソッドを 1 回呼び出すだけで、表現がコンパイルされ、入力シーケンスとのマッチが行われます。次の文は、前述の 3 つの文と等価です。

 boolean b = Pattern.matches("a*b", "aaaaab");
ただし、マッチを繰り返す場合は、コンパイル済みのパターンを再利用できないため、効率が低下します。  

このクラスのインスタンスは不変であるため、複数のスレッドで並行して使用できます。Matcher クラスのインスタンスは、複数スレッドでの並行使用に対応していません。

正規表現構文の要約

構文 Matches
 
文字
x 文字 x
\\ バックスラッシュ文字
\0n 8 進値 0n を持つ文字 (0 <= n <= 7)
\0nn 8 進値 0nn を持つ文字 (0 <= n <= 7)
\0mnn 8 進値 0mnn を持つ文字 (0 <= m <= 3、0 <= n <= 7)
\xhh 16 進値 0xhh を持つ文字
\uhhhh 16 進値 0xhhhh を持つ文字
\t タブ文字 ('\u0009')
\n 改行文字 ('\u000A')
\r キャリッジリターン文字 ('\u000D')
\f 用紙送り文字 ('\u000C')
\a 警告 (ベル) 文字 ('\u0007')
\e エスケープ文字 ('\u001B')
\cx x に対応する制御文字
 
文字クラス
[abc] ab、または c (単純クラス)
[^abc] abc 以外の文字 (否定)
[a-zA-Z] az または AZ (範囲)
[a-d[m-p]] ad、または mp:[a-dm-p] (結合)
[a-z&&[def]] def (交差)
[a-z&&[^bc]] bc を除く az:[ad-z] (減算)
[a-z&&[^m-p]] mp を除く az:[a-lq-z] (減算)
 
定義済みの文字クラス
. 任意の文字 (行末記号とマッチする場合もある)
\d 数字: [0-9]
\D 数字以外: [^0-9]
\s 空白文字:[ \t\n\x0B\f\r]
\S 非空白文字:[^\s]
\w 単語構成文字:[a-zA-Z_0-9]
\W 非単語文字:[^\w]
 
POSIX 文字クラス (US-ASCII のみ)
\p{Lower} 小文字の英字:[a-z]
\p{Upper} 大文字の英字: [A-Z]
\p{ASCII} すべての ASCII 文字: [\x00-\x7F]
\p{Alpha} 英字: [\p{Lower}\p{Upper}]
\p{Digit} 10 進数字: [0-9]
\p{Alnum} 英数字: [\p{Alpha}\p{Digit}]
\p{Punct} 句読文字:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ のいずれか
\p{Graph} 表示できる文字:[\p{Alnum}\p{Punct}]
\p{Print} プリント可能文字:[\p{Graph}\x20]
\p{Blank} 空白またはタブ:[ \t]
\p{Cntrl} 制御文字:[\x00-\x1F\x7F]
\p{XDigit} 16 進数字:[0-9a-fA-F]
\p{Space} 空白文字:[ \t\n\x0B\f\r]
 
java.lang.Character クラス (単純な java 文字タイプ)
\p{javaLowerCase} java.lang.Character.isLowerCase() と等価
\p{javaUpperCase} java.lang.Character.isUpperCase() と等価
\p{javaWhitespace} java.lang.Character.isWhitespace() と等価
\p{javaMirrored} java.lang.Character.isMirrored() と等価
 
Unicode ブロックとカテゴリのクラス
\p{InGreek} ギリシャ語ブロックの文字 (単純ブロック)
\p{Lu} 大文字 (単純カテゴリ)
\p{Sc} 通貨記号
\P{InGreek} ギリシャ語ブロック以外の文字 (否定)
[\p{L}&&[^\p{Lu}]]  大文字以外の文字 (減算)
 
境界正規表現エンジン
^ 行の先頭
$ 行の末尾
\b 単語境界
\B 非単語境界
\A 入力の先頭
\G 前回のマッチの末尾
\Z 最後の行末記号がある場合は、それを除く入力の末尾
\z 入力の末尾
 
最長一致数量子
X? X、1 または 0 回
X* X、0 回以上
X+ X、1 回以上
X{n} Xn
X{n,} Xn 回以上
X{n,m} Xn 回以上、m 回以下
 
最短一致数量子
X?? X、1 または 0 回
X*? X、0 回以上
X+? X、1 回以上
X{n}? Xn
X{n,}? Xn 回以上
X{n,m}? Xn 回以上、m 回以下
 
強欲な数量子
X?+ X、1 または 0 回
X*+ X、0 回以上
X++ X、1 回以上
X{n}+ Xn
X{n,}+ Xn 回以上
X{n,m}+ Xn 回以上、m 回以下
 
論理演算子
XY X の直後に Y
X|Y X または Y
(X) X、前方参照を行う正規表現グループ
 
前方参照
\n マッチした n 番目の前方参照を行う正規表現グループ
 
引用
\ 正規表現ではないが、次の文字をエスケープする
\Q 正規表現ではないが、\E までのすべての文字をエスケープする
\E 正規表現ではないが、\Q で開始された引用をエスケープする
 
特殊な構文 (前方参照を行わない)
(?:X) X、前方参照を行わない正規表現グループ
(?idmsux-idmsux)  正規表現ではないが、マッチフラグ idmsux のオン/オフを切り替える
(?idmsux-idmsux:X)   X前方参照を行わないグループ。指定されたフラグ idmsux のオン/オフを切り替える
(?=X) X、幅ゼロの肯定先読み
(?!X) X、幅ゼロの否定先読み
(?<=X) X、幅ゼロの肯定後読み
(?<!X) X、幅ゼロの否定後読み
(?>X) X、独立した前方参照を行わない正規表現グループ

バックスラッシュ、エスケープ、および引用

 

バックスラッシュ文字 ('\') は、前述の表に定義されている構文をエスケープします。 また、指定しなかった場合は、エスケープされていないと解釈される文字列を引用します。たとえば、正規表現 \\ は 1 つのバックスラッシュとマッチし、\{ は左括弧とマッチします。  

英字の前にバックスラッシュを使用したときに、その英字がエスケープ構文でない場合は、エラーになります。 これらのパターンは、正規表現言語の今後の拡張に予約されています。英字以外の文字の場合は、その文字がエスケープ構文に含まれるかどうかにかかわらず、バックスラッシュを指定できます。  

Java 言語仕様では、Java ソースコードの文字列リテラルに含まれるバックスラッシュは、Unicode エスケープなどの文字エスケープとして有効であると解釈されます。このため、バックスラッシュが Java バイトコードコンパイラによって解釈されないようにするには、正規表現を表す文字列リテラル内でバックスラッシュを 2 つ続ける必要があります。たとえば、文字列リテラル "\b" は、正規表現と解釈されると、バックスペース 1 文字とマッチされます。 しかし、"\\b" は単語境界とマッチされます。また、文字列リテラル "\(hello\)" は不当になり、コンパイル時エラーが発生します。 文字列 (hello) とマッチされるには、文字列リテラル "\\(hello\\)" を使用する必要があります。

文字クラス

1     リテラルエスケープ     \x
2     グループ化 [...]
3     範囲 a-z
4     論理和 [a-e][i-u]
5     論理積 [a-z&&[aeiou]]

行末記号

 

「行末記号」とは、入力文字シーケンスの行の末尾を指定するときに使用する、1 文字または 2 文字の文字シーケンスです。次の文字が行末記号として認識されます。

 

UNIX_LINES モードが有効な場合は、改行文字だけが行末記号として認識されます。  

正規表現 . は、DOTALL フラグが指定されていない場合、行末記号以外のすべての文字とマッチします。  

デフォルトでは、正規表現 ^ および $ は行末記号を無視し、入力シーケンス全体のそれぞれ先頭と末尾だけにマッチします。MULTILINE モードがアクティブになると、^ は入力の先頭、および入力の末尾を除くすべての行末記号の後にマッチします。MULTILINE モードの場合、$ は行末記号の直前、または入力シーケンスの末尾にマッチします。

正規表現グループと前方参照

 

前方参照を行う正規表現グループには、左から右方向に左丸括弧を数えることによって、番号が付けられます。たとえば、表現 ((A)(B(C))) は、次の 4 つのグループに分類されます。

1     ((A)(B(C)))
2     (A)
3     (B(C))
4     (C)
 

グループ 0 は、常に表現全体を表します。  

前方参照を行う正規表現グループがこのように分類されてから、入力シーケンスの各部分シーケンスがこれらのグループとマッチされ、マッチするたびに部分シーケンスが保存されます。正規表現グループの部分シーケンスは、前方参照として表現内であとで使用できます。 また、マッチ操作が完了したら、正規表現エンジンから取り出すこともできます。  

グループと入力シーケンスがマッチされると、そのグループと最後にマッチした部分シーケンスが常に前方参照されます。数量子を指定した場合は、グループがもう一度評価されます。 2 回目の評価が失敗した場合でも、その前に前方参照された値がある場合は、その値が保持されます。たとえば、文字列 "aba" を表現 (a(b)?)+ とマッチした場合は、グループ 2 に設定された "b" が保持されます。前方参照されたすべての入力は、各マッチが始まる前に破棄されます。  

(? で始まるグループは、純粋な「前方参照されない正規表現」グループで、テキストを前方参照せず、グループ全体にカウントされません。

Unicode サポート

 

このクラスは、『Unicode Technical Standard #18: Unicode Regular Expression Guidelines』 (ユニコードテクニカルスタンダード No.18:ユニコード正規表現ガイドライン) および、リリース 2.1 『Canonical Equivalents』 (正規等価) を参照してください。  

Java ソースコードでは、\u2014 などの Unicode エスケープシーケンスは、「Java 言語仕様」の ?3.3 に基づいて処理されます。これらのエスケープシーケンスは、正規表現パーサーによって直接実装されるため、ファイルまたはキーボードから読み込んだ表現の中でも Unicode エスケープを使用できます。つまり、文字列 "\u2014""\\u2014" は等価ではありませんが、同じパターンにコンパイルされ、16 進値 0x2014 の文字とマッチします。

Unicode ブロックおよびカテゴリは、Perl と同様に \p および \P 構文で記述します。入力にプロパティー prop が含まれる場合、\p{prop} はマッチしますが、\P{prop} はマッチしません。ブロックには、InMongolian のように、接頭辞 In を指定します。カテゴリには、接頭辞 Is を指定することもできます。\p{L}\p{IsL} は、Unicode 文字のカテゴリを表します。ブロックとカテゴリは、文字クラスの内部および外部のどちらにも使用できます。  

サポートされているカテゴリは、Character クラスで指定されたバージョンの The Unicode Standard に記載されています。カテゴリ名については、Unicode 標準に規準と情報が定義されています。Pattern のサポートするブロック名は、UnicodeBlock.forName により受け入れられ、定義される有効なブロック名です。

methodname メソッド (非推奨のメソッドを除く) である java.lang.Character boolean と同様に機能するカテゴリは、指定されたプロパティーが名前 javamethodname を持つ、同一の \p{prop} 構文全体で使用可能です。

Perl 5 との比較

 

Pattern エンジンは、Perl 5 と同じく、順序付けされた代替に対する従来の NFA ベースのマッチングを実行します。  

このクラスでサポートされていない Perl 構文

 

このクラスでサポートされているが、Perl でサポートされていない構文 強欲な数量子。

 

Perl との大きな相違点

 

正規表現構文の動作の詳細については、『Mastering Regular Expressions, 3rd Edition』 (Jeffrey E. F. Friedl 著、O'Reilly and Associates、2006 年) を参照してください。

導入されたバージョン:
1.4
関連項目:
String.split(String, int), String.split(String), 直列化された形式

フィールドの概要
static int CANON_EQ
          正規等価を有効にします。
static int CASE_INSENSITIVE
          大文字と小文字を区別しないマッチングを有効にします。
static int COMMENTS
          パターン内で空白とコメントを使用できるようにします。
static int DOTALL
          DOTALL モードを有効にします。
static int LITERAL
          パターンのリテラル構文解析を有効にします。
static int MULTILINE
          複数行モードを有効にします。
static int UNICODE_CASE
          Unicode に準拠した大文字と小文字を区別しないマッチングを有効にします。
static int UNIX_LINES
          Unix ラインモードを有効にします。
 
メソッドの概要
static Pattern compile(String regex)
          指定された正規表現をパターンにコンパイルします。
static Pattern compile(String regex, int flags)
          指定されたフラグを使用して、指定された正規表現をパターンにコンパイルします。
 int flags()
          このパターンのマッチフラグを返します。
 Matcher matcher(CharSequence input)
          指定された入力とこのパターンをマッチする正規表現エンジンを作成します。
static boolean matches(String regex, CharSequence input)
          指定された正規表現をコンパイルして、指定された入力とその正規表現をマッチします。
 String pattern()
          このパターンのコンパイル元の正規表現を返します。
static String quote(String s)
          指定された String のリテラルパターン String を返します。
 String[] split(CharSequence input)
          このパターンのマッチに基づいて、指定された入力シーケンスを分割します。
 String[] split(CharSequence input, int limit)
          このパターンのマッチに基づいて、指定された入力シーケンスを分割します。
 String toString()
           このパターンの文字列表現を返します。
 
クラス java.lang.Object から継承されたメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

フィールドの詳細

UNIX_LINES

public static final int UNIX_LINES
Unix ラインモードを有効にします。  

このモードでは、'\n' 行末記号以外は、.^$ の動作で認識されません。  

Unix ラインモードは、埋め込みフラグ表現 (?d) 使用して有効にすることもできます。

関連項目:
定数フィールド値

CASE_INSENSITIVE

public static final int CASE_INSENSITIVE
大文字と小文字を区別しないマッチングを有効にします。  

デフォルトの大文字と小文字を区別しないマッチングでは、US-ASCII 文字セットの文字だけがマッチします。Unicode に準拠した大文字と小文字を区別しないマッチングを有効にするには、UNICODE_CASE フラグをこのフラグと組み合わせて指定します。  

大文字と小文字を区別しないマッチングは、埋め込みフラグ表現 (?i) を使用して有効にすることもできます。  

このフラグを指定すると、パフォーマンスがわずかに低下する場合があります。

関連項目:
定数フィールド値

COMMENTS

public static final int COMMENTS
パターン内で空白とコメントを使用できるようにします。  

このモードでは、空白は無視され、# で始まる埋め込みコメントは行末まで無視されます。  

コメントモードは、埋め込みフラグ表現  (?x) を使用して有効にすることもできます。

関連項目:
定数フィールド値

MULTILINE

public static final int MULTILINE
複数行モードを有効にします。  

複数行モードでは、表現 ^$ は、それぞれ行末記号または入力シーケンスの末尾の直後または直前にマッチします。デフォルトでは、これらの表現は入力シーケンス全体の先頭と末尾にだけマッチします。  

複数行モードは、埋め込みフラグ表現 (?m) を使用して有効にすることもできます。

関連項目:
定数フィールド値

LITERAL

public static final int LITERAL
パターンのリテラル構文解析を有効にします。  

このフラグが指定されている場合、パターンを指定する入力文字列は、リテラル文字のシーケンスとして処理されます。入力シーケンス内のメタキャラクタまたはエスケープシーケンスに、特別な意味はありません。  

CASE_INSENSITIVE および UNICODE_CASE フラグをこのフラグとともに使用すると、マッチングに対する影響が維持されます。ほかのフラグは不要になります。  

リテラル構文解析を有効にするための埋め込みフラグ文字はありません。

導入されたバージョン:
1.5
関連項目:
定数フィールド値

DOTALL

public static final int DOTALL
DOTALL モードを有効にします。  

DOTALL モードでは、表現 . は行末記号を含む任意の文字にマッチします。デフォルトでは、この表現は行末記号にマッチしません。  

DOTALL モードは、埋め込みフラグ表現 (?s) を使用して有効にすることもできます。(s は「single-line (単一行)」モードのニーモニック。Perl ではこう呼ばれている。)

関連項目:
定数フィールド値

UNICODE_CASE

public static final int UNICODE_CASE
Unicode に準拠した大文字と小文字を区別しないマッチングを有効にします。  

このフラグと CASE_INSENSITIVE フラグを同時に指定した場合は、Unicode 標準に準拠した大文字と小文字を区別しないマッチングが行われます。デフォルトの大文字と小文字を区別しないマッチングでは、US-ASCII 文字セットの文字だけがマッチします。  

Unicode に準拠した大文字と小文字を区別しないマッチングは、埋め込みフラグ表現 (?u) を使用して有効にすることもできます。  

このフラグを指定すると、パフォーマンスが低下する場合があります。

関連項目:
定数フィールド値

CANON_EQ

public static final int CANON_EQ
正規等価を有効にします。  

このフラグを指定したときは、2 つの文字の完全な正規分解がマッチした場合に限り、それらの文字がマッチするとみなされます。たとえば、このフラグを指定すると、表現 "a\u030A" は文字列 "\u00E5" にマッチします。デフォルトのマッチングでは、正規等価が考慮されません。  

正規等価を有効にするための埋め込みフラグ文字はありません。  

このフラグを指定すると、パフォーマンスが低下する場合があります。

関連項目:
定数フィールド値
メソッドの詳細

compile

public static Pattern compile(String regex)
指定された正規表現をパターンにコンパイルします。

パラメータ:
regex - コンパイルされる表現
例外:
PatternSyntaxException - 表現の構文が無効である場合

compile

public static Pattern compile(String regex,
                              int flags)
指定されたフラグを使用して、指定された正規表現をパターンにコンパイルします。

パラメータ:
regex - コンパイルされる表現
flags - マッチフラグ。CASE_INSENSITIVEMULTILINEDOTALLUNICODE_CASECANON_EQUNIX_LINESLITERAL、および COMMENTS を含めることのできるビットマスク
例外:
IllegalArgumentException - 定義済みマッチフラグに対応するビット値以外の値が flags に設定されている場合
PatternSyntaxException - 表現の構文が無効である場合

pattern

public String pattern()
このパターンのコンパイル元の正規表現を返します。

戻り値:
このパターンのコンパイル元

toString

public String toString()
 

このパターンの文字列表現を返します。これは、このパターンのコンパイル元の正規表現です。

オーバーライド:
クラス Object 内の toString
戻り値:
このパターンの文字列表現
導入されたバージョン:
1.5

matcher

public Matcher matcher(CharSequence input)
指定された入力とこのパターンをマッチする正規表現エンジンを作成します。

パラメータ:
input - マッチされる文字シーケンス
戻り値:
このパターンの新しい正規表現エンジン

flags

public int flags()
このパターンのマッチフラグを返します。

戻り値:
このパターンがコンパイルされたときに指定されたマッチフラグ

matches

public static boolean matches(String regex,
                              CharSequence input)
指定された正規表現をコンパイルして、指定された入力とその正規表現をマッチします。  

このメソッドを次の形式で呼び出すと、上記の動作が行われます。

 Pattern.matches(regex, input);
上記のメソッドは、次の表現と同様に動作します。
 Pattern.compile(regex).matcher(input).matches()
 

パターンを繰り返し使用する場合は、そのパターンをコンパイルして再利用した方が、毎回このメソッドを呼び出すよりも効率的です。

パラメータ:
regex - コンパイルされる表現
input - マッチされる文字シーケンス
例外:
PatternSyntaxException - 表現の構文が無効である場合

split

public String[] split(CharSequence input,
                      int limit)
このパターンのマッチに基づいて、指定された入力シーケンスを分割します。  

このメソッドから返される配列は、入力シーケンスの部分文字列で構成されます。 これらの部分文字列は、このパターンとマッチする別の部分シーケンスによって分割された文字列か、入力シーケンスの終了によって分割された文字列です。配列内の部分文字列は、入力シーケンス内で発生した順番に並んでいます。このパターンが入力シーケンスの部分シーケンスにマッチしない場合、結果として得られる配列は 1 つの要素、つまり文字列形式の入力シーケンスだけで構成されます。  

limit パラメータは、このパターンの適用回数、つまり、結果として得られる配列の長さを制御します。制限 n がゼロより大きい場合、このパターンは n - 1 回以下の回数が適用され、配列の長さは n 次のようになります。 配列の最後のエントリには、最後にマッチした区切り文字以降の入力シーケンスがすべて含まれます。n が負の値の場合、このパターンの適用回数と配列の長さは制限されません。n がゼロの場合、このパターンの適用回数と配列の長さは制限されませんが、後続の空の文字列は破棄されます。  

たとえば、入力シーケンス "boo:and:foo" は、これらのパラメータによって次のように分割されます。

正規表現    

制限    

結果    

: 2 { "boo", "and:foo" }
: 5 { "boo", "and", "foo" }
: -2 { "boo", "and", "foo" }
o 5 { "b", "", ":and:f", "", "" }
o -2 { "b", "", ":and:f", "", "" }
o 0 { "b", "", ":and:f" }

パラメータ:
input - 分割される文字シーケンス
limit - 結果のしきい値 (上記のとおり)
戻り値:
このパターンのマッチの両端で入力を分割することによって計算された文字列の配列

split

public String[] split(CharSequence input)
このパターンのマッチに基づいて、指定された入力シーケンスを分割します。  

このメソッドは、limit 引数をゼロにして split メソッドを呼び出した場合と同様に入力シーケンスを分割します。つまり、結果として得られる配列には後続の空の文字列は含まれません。

 

たとえば、入力シーケンス "boo:and:foo" は、これらの表現によって次のように分割されます。

正規表現    

結果

: { "boo", "and", "foo" }
o { "b", "", ":and:f" }

パラメータ:
input - 分割される文字シーケンス
戻り値:
このパターンのマッチの両端で入力を分割することによって計算された文字列の配列

quote

public static String quote(String s)
指定された String のリテラルパターン String を返します。  

このメソッドは、リテラルパターンであるかのように文字列 s にマッチする Pattern の作成に使用可能な String を生成します。

入力シーケンス内のメタキャラクタまたはエスケープシーケンスに、特別な意味はありません。

パラメータ:
s - リテラル化する文字列
戻り値:
リテラル文字列置換
導入されたバージョン:
1.5

JavaTM Platform
Standard Ed. 6

バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。

Copyright 2009 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。