|
JavaTM Platform Standard Ed. 6 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
java.lang.Object java.util.regex.Pattern
public final class Pattern
コンパイル済みの正規表現です。
正規表現は、文字列として指定し、このクラスのインスタンスにコンパイルする必要があります。結果として得られるパターンは、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] | a、b、または c (単純クラス) |
[^abc] | a、b、c 以外の文字 (否定) |
[a-zA-Z] | a 〜 z または A 〜 Z (範囲) |
[a-d[m-p]] | a 〜 d、または m 〜 p:[a-dm-p] (結合) |
[a-z&&[def]] | d、e、f (交差) |
[a-z&&[^bc]] | b と c を除く a 〜 z:[ad-z] (減算) |
[a-z&&[^m-p]] | m 〜 p を除く a 〜 z:[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} | X、n 回 |
X{n,} | X、n 回以上 |
X{n,m} | X、n 回以上、m 回以下 |
最短一致数量子 | |
X?? | X、1 または 0 回 |
X*? | X、0 回以上 |
X+? | X、1 回以上 |
X{n}? | X、n 回 |
X{n,}? | X、n 回以上 |
X{n,m}? | X、n 回以上、m 回以下 |
強欲な数量子 | |
X?+ | X、1 または 0 回 |
X*+ | X、0 回以上 |
X++ | X、1 回以上 |
X{n}+ | X、n 回 |
X{n,}+ | X、n 回以上 |
X{n,m}+ | X、n 回以上、m 回以下 |
論理演算子 | |
XY | X の直後に Y |
X|Y | X または Y |
(X) | X、前方参照を行う正規表現グループ |
前方参照 | |
\n | マッチした n 番目の前方参照を行う正規表現グループ |
引用 | |
\ | 正規表現ではないが、次の文字をエスケープする |
\Q | 正規表現ではないが、\E までのすべての文字をエスケープする |
\E | 正規表現ではないが、\Q で開始された引用をエスケープする |
特殊な構文 (前方参照を行わない) | |
(?:X) | X、前方参照を行わない正規表現グループ |
(?idmsux-idmsux) | 正規表現ではないが、マッチフラグ i、d、m、s、u、x のオン/オフを切り替える |
(?idmsux-idmsux:X) | X、前方参照を行わないグループ。指定されたフラグ i、d、m、s、u、x のオン/オフを切り替える |
(?=X) | X、幅ゼロの肯定先読み |
(?!X) | X、幅ゼロの否定先読み |
(?<=X) | X、幅ゼロの肯定後読み |
(?<!X) | X、幅ゼロの否定後読み |
(?>X) | X、独立した前方参照を行わない正規表現グループ |
バックスラッシュ文字 ('\') は、前述の表に定義されている構文をエスケープします。 また、指定しなかった場合は、エスケープされていないと解釈される文字列を引用します。たとえば、正規表現 \\ は 1 つのバックスラッシュとマッチし、\{ は左括弧とマッチします。
英字の前にバックスラッシュを使用したときに、その英字がエスケープ構文でない場合は、エラーになります。 これらのパターンは、正規表現言語の今後の拡張に予約されています。英字以外の文字の場合は、その文字がエスケープ構文に含まれるかどうかにかかわらず、バックスラッシュを指定できます。
Java 言語仕様では、Java ソースコードの文字列リテラルに含まれるバックスラッシュは、Unicode エスケープなどの文字エスケープとして有効であると解釈されます。このため、バックスラッシュが Java バイトコードコンパイラによって解釈されないようにするには、正規表現を表す文字列リテラル内でバックスラッシュを 2 つ続ける必要があります。たとえば、文字列リテラル "\b" は、正規表現と解釈されると、バックスペース 1 文字とマッチされます。 しかし、"\\b" は単語境界とマッチされます。また、文字列リテラル "\(hello\)" は不当になり、コンパイル時エラーが発生します。 文字列 (hello) とマッチされるには、文字列リテラル "\\(hello\\)" を使用する必要があります。
「行末記号」とは、入力文字シーケンスの行の末尾を指定するときに使用する、1 文字または 2 文字の文字シーケンスです。次の文字が行末記号として認識されます。
正規表現 . は、 デフォルトでは、正規表現 ^ および $ は行末記号を無視し、入力シーケンス全体のそれぞれ先頭と末尾だけにマッチします。 前方参照を行う正規表現グループには、左から右方向に左丸括弧を数えることによって、番号が付けられます。たとえば、表現 ((A)(B(C))) は、次の 4 つのグループに分類されます。 グループ 0 は、常に表現全体を表します。
前方参照を行う正規表現グループがこのように分類されてから、入力シーケンスの各部分シーケンスがこれらのグループとマッチされ、マッチするたびに部分シーケンスが保存されます。正規表現グループの部分シーケンスは、前方参照として表現内であとで使用できます。 また、マッチ操作が完了したら、正規表現エンジンから取り出すこともできます。
グループと入力シーケンスがマッチされると、そのグループと最後にマッチした部分シーケンスが常に前方参照されます。数量子を指定した場合は、グループがもう一度評価されます。 2 回目の評価が失敗した場合でも、その前に前方参照された値がある場合は、その値が保持されます。たとえば、文字列 "aba" を表現 (a(b)?)+ とマッチした場合は、グループ 2 に設定された "b" が保持されます。前方参照されたすべての入力は、各マッチが始まる前に破棄されます。
(? で始まるグループは、純粋な「前方参照されない正規表現」グループで、テキストを前方参照せず、グループ全体にカウントされません。
このクラスは、『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 文字のカテゴリを表します。ブロックとカテゴリは、文字クラスの内部および外部のどちらにも使用できます。
サポートされているカテゴリは、 methodname メソッド (非推奨のメソッドを除く) である java.lang.Character boolean と同様に機能するカテゴリは、指定されたプロパティーが名前 javamethodname を持つ、同一の \p{prop} 構文全体で使用可能です。
このクラスでサポートされていない Perl 構文 条件付き構文 (?{X}) および (?(条件)X|Y)
埋め込みコード構文 (?{コード}) および (??{コード}) 埋め込みコメント構文 (?#コメント) プリプロセス演算 \l \u、\L、\U このクラスでサポートされているが、Perl でサポートされていない構文 強欲な数量子。 できるだけ長い文字列とマッチする。 後戻り (バックトラック) すれば正規表現全体のマッチが成功するときでも、後戻りしない 文字クラスの結合と交差 (前述) Perl との大きな相違点 Perl では、\1 〜 \9 は常に前方参照と解釈される。 を超える数字がバックスラッシュでエスケープされているときは、対応する数の部分パターンが存在する場合、前方参照とみなされる。 存在しない場合は、8 進数のエスケープ (可能な場合) とみなされる。このクラスでは、8 進数のエスケープは常にゼロで始まる。\1 〜 \9 は、常に前方参照と解釈される。それより大きい数字は、正規表現のその箇所に対応する数の部分パターンが存在する場合は、前方参照とみなされる。 存在しない場合は、その数字が既存のグループ番号以下になるか、1 桁の数字になるまで、桁が減らされる
Perl では、最後のマッチが終了した場所からマッチの再開を要求するときは、g フラグを使用する。この機能は、 Perl では、表現の最上位に埋め込まれたフラグが表現全体に適用される。このクラスの埋め込みフラグは、埋め込まれた場所にかかわらず、その箇所でのみ有効になる。 フラグがグループ内に埋め込まれている場合は、Perl と同様にグループの最後で復元される Perl では、表現 *a などの不正なマッチ構文や表現 abc] などのぶら下がり括弧を許容しており、それらをリテラルとみなす。このクラスでもぶら下がり括弧は受け入れるが、+、?、* などのぶら下がりメタキャラクタは許容せず、それらが見つかった場合は 正規表現構文の動作の詳細については、『Mastering Regular Expressions, 3rd Edition』 (Jeffrey E. F. Friedl 著、O'Reilly and Associates、2006 年) を参照してください。
文字クラス
1
リテラルエスケープ
\x 2
グループ化
[...] 3
範囲
a-z 4
論理和
[a-e][i-u] 5
論理積
[a-z&&[aeiou]] 行末記号
UNIX_LINES
モードが有効な場合は、改行文字だけが行末記号として認識されます。
DOTALL
フラグが指定されていない場合、行末記号以外のすべての文字とマッチします。
MULTILINE
モードがアクティブになると、^ は入力の先頭、および入力の末尾を除くすべての行末記号の後にマッチします。MULTILINE
モードの場合、$ は行末記号の直前、または入力シーケンスの末尾にマッチします。
正規表現グループと前方参照
1
((A)(B(C))) 2
(A) 3
(B(C)) 4
(C) Unicode サポート
Character
クラスで指定されたバージョンの The Unicode Standard に記載されています。カテゴリ名については、Unicode 標準に規準と情報が定義されています。Pattern
のサポートするブロック名は、UnicodeBlock.forName
により受け入れられ、定義される有効なブロック名です。
Perl 5 との比較
Pattern
エンジンは、Perl 5 と同じく、順序付けされた代替に対する従来の NFA ベースのマッチングを実行します。
Matcher
クラスによって暗黙的に提供される。find
メソッドを繰り返し呼び出すと、正規表現エンジンがリセットされないかぎり、最後のマッチが終了した場所からマッチ操作が再開する PatternSyntaxException
をスローする
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 |
フィールドの詳細 |
---|
public static final int UNIX_LINES
このモードでは、'\n' 行末記号以外は、.、^、$ の動作で認識されません。
Unix ラインモードは、埋め込みフラグ表現 (?d) 使用して有効にすることもできます。
public static final int CASE_INSENSITIVE
デフォルトの大文字と小文字を区別しないマッチングでは、US-ASCII 文字セットの文字だけがマッチします。Unicode に準拠した大文字と小文字を区別しないマッチングを有効にするには、UNICODE_CASE
フラグをこのフラグと組み合わせて指定します。
大文字と小文字を区別しないマッチングは、埋め込みフラグ表現 (?i) を使用して有効にすることもできます。
このフラグを指定すると、パフォーマンスがわずかに低下する場合があります。
public static final int COMMENTS
このモードでは、空白は無視され、# で始まる埋め込みコメントは行末まで無視されます。
コメントモードは、埋め込みフラグ表現 (?x) を使用して有効にすることもできます。
public static final int MULTILINE
複数行モードでは、表現 ^ と $ は、それぞれ行末記号または入力シーケンスの末尾の直後または直前にマッチします。デフォルトでは、これらの表現は入力シーケンス全体の先頭と末尾にだけマッチします。
複数行モードは、埋め込みフラグ表現 (?m) を使用して有効にすることもできます。
public static final int LITERAL
このフラグが指定されている場合、パターンを指定する入力文字列は、リテラル文字のシーケンスとして処理されます。入力シーケンス内のメタキャラクタまたはエスケープシーケンスに、特別な意味はありません。
CASE_INSENSITIVE および UNICODE_CASE フラグをこのフラグとともに使用すると、マッチングに対する影響が維持されます。ほかのフラグは不要になります。
リテラル構文解析を有効にするための埋め込みフラグ文字はありません。
public static final int DOTALL
DOTALL モードでは、表現 . は行末記号を含む任意の文字にマッチします。デフォルトでは、この表現は行末記号にマッチしません。
DOTALL モードは、埋め込みフラグ表現 (?s) を使用して有効にすることもできます。(s は「single-line (単一行)」モードのニーモニック。Perl ではこう呼ばれている。)
public static final int UNICODE_CASE
このフラグと CASE_INSENSITIVE
フラグを同時に指定した場合は、Unicode 標準に準拠した大文字と小文字を区別しないマッチングが行われます。デフォルトの大文字と小文字を区別しないマッチングでは、US-ASCII 文字セットの文字だけがマッチします。
Unicode に準拠した大文字と小文字を区別しないマッチングは、埋め込みフラグ表現 (?u) を使用して有効にすることもできます。
このフラグを指定すると、パフォーマンスが低下する場合があります。
public static final int CANON_EQ
このフラグを指定したときは、2 つの文字の完全な正規分解がマッチした場合に限り、それらの文字がマッチするとみなされます。たとえば、このフラグを指定すると、表現 "a\u030A" は文字列 "\u00E5" にマッチします。デフォルトのマッチングでは、正規等価が考慮されません。
正規等価を有効にするための埋め込みフラグ文字はありません。
このフラグを指定すると、パフォーマンスが低下する場合があります。
メソッドの詳細 |
---|
public static Pattern compile(String regex)
regex
- コンパイルされる表現
PatternSyntaxException
- 表現の構文が無効である場合public static Pattern compile(String regex, int flags)
regex
- コンパイルされる表現flags
- マッチフラグ。CASE_INSENSITIVE
、MULTILINE
、DOTALL
、UNICODE_CASE
、CANON_EQ
、UNIX_LINES
、LITERAL
、および COMMENTS
を含めることのできるビットマスク
IllegalArgumentException
- 定義済みマッチフラグに対応するビット値以外の値が flags に設定されている場合
PatternSyntaxException
- 表現の構文が無効である場合public String pattern()
public String toString()
このパターンの文字列表現を返します。これは、このパターンのコンパイル元の正規表現です。
Object
内の toString
public Matcher matcher(CharSequence input)
input
- マッチされる文字シーケンス
public int flags()
public static boolean matches(String regex, CharSequence input)
このメソッドを次の形式で呼び出すと、上記の動作が行われます。
上記のメソッドは、次の表現と同様に動作します。Pattern.matches(regex, input);
Pattern.compile(regex).matcher(input).matches()
パターンを繰り返し使用する場合は、そのパターンをコンパイルして再利用した方が、毎回このメソッドを呼び出すよりも効率的です。
regex
- コンパイルされる表現input
- マッチされる文字シーケンス
PatternSyntaxException
- 表現の構文が無効である場合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
- 結果のしきい値 (上記のとおり)
public String[] split(CharSequence input)
このメソッドは、limit 引数をゼロにして split
メソッドを呼び出した場合と同様に入力シーケンスを分割します。つまり、結果として得られる配列には後続の空の文字列は含まれません。
たとえば、入力シーケンス "boo:and:foo" は、これらの表現によって次のように分割されます。
正規表現
結果
: { "boo", "and", "foo" } o { "b", "", ":and:f" }
input
- 分割される文字シーケンス
public static String quote(String s)
String
のリテラルパターン String
を返します。
このメソッドは、リテラルパターンであるかのように文字列 s
にマッチする Pattern
の作成に使用可能な String
を生成します。
s
- リテラル化する文字列
|
JavaTM Platform Standard Ed. 6 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
Copyright 2009 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。