モジュール java.base
パッケージ 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回呼び出すだけで、表現がコンパイルされ、入力シーケンスとのマッチが行われます。 次の文

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

このクラスのインスタンスは不変であるため、複数のスレッドで並行して使用できます。 Matcherクラスのインスタンスは、そのような用途に安全に使用できません。

正規表現構文のサマリー

正規表現の構文とそれらがマッチするもの
コンストラクト マッチ
文字
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の文字
\x{h...h} 16進値0xh...hの文字 (Character.MIN_CODE_POINT <= 0xh...h <= Character.MAX_CODE_POINT)
\N{name} Unicode文字の名前が'name'の文字
\t タブ文字('\u0009')
\n 改行(ライン・フィード)文字('\u000A')
\r キャリッジ・リターン文字 ('\u000D')
\f フォーム・フィード文字('\u000C')
\a アラート(ベル)文字('\u0007')
\e エスケープ文字('\u001B')
\cx xに対応する制御文字
文字クラス
[abc] ab、またはc (単純クラス)
[^abc] abc以外の文字(否定)
[a-zA-Z] a - zまたはA - Z (範囲)
[a-d[m-p]] a - dまたはm - p: [a-dm-p] (結合)
[a-z&&[def]] de、またはf (交差)
[a-z&&[^bc]] a - z (bcを除く): [ad-z] (減算)
[a-z&&[^m-p]] a - z (m - pを除く): [a-lq-z] (減算)
定義済の文字クラス
. 任意の文字(行末記号とマッチする場合もある)
\d 数字: * UNICODE_CHARACTER_CLASSが設定されていない場合は[0-9] 「Unicodeサポート」を参照してください。
\D 数字以外: [^0-9]
\h 水平方向の空白文字: [ \t\xA0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000]
\H 水平以外の空白文字: [^\h]
\s 空白文字: UNICODE_CHARACTER_CLASSが設定されていない場合は[ \t\n\x0B\f\r] 「Unicodeサポート」を参照してください。
\S 空白以外の文字: [^\s]
\v 垂直方向の空白文字: [\n\x0B\f\r\x85\u2028\u2029]
\V 垂直方向以外の空白文字: [^\v]
\w 単語文字: UNICODE_CHARACTER_CLASSが設定されていない場合は[a-zA-Z_0-9] 「Unicodeサポート」を参照してください。
\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} 句読文字: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~の1つ
\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{IsLatin} Latin スクリプト文字(スクリプト)
\p{InGreek} Greek ブロックの文字(ブロック)
\p{Lu} 大文字(カテゴリ)
\p{IsAlphabetic} 英字(バイナリ・プロパティ)
\p{Sc} 通貨記号
\P{InGreek} ギリシャ語ブロック以外の文字(否定)
[\p{L}&&[^\p{Lu}]] 大文字以外の文字(減算)
境界マッチャ
^ 行の先頭
$ 行の末尾
\b 単語境界 : (?:(?<=\w)(?=\W)|(?<=\W)(?=\w)) (単語以外の文字が単語文字と接する場所)
\b{g} Unicode拡張書記素クラスタ境界
\B 単語以外の境界: [^\b]
\A 入力の先頭
\G 前回のマッチの末尾
\Z 最後の行末記号がある場合は、それを除く入力の末尾 
\z 入力の末尾
改行マッチャ
\R Unicode改行シーケンス、\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029] と同等です
Unicode Extended Grapheme matcher
\X 任意のUnicode拡張書記素クラスタ
最長一致数量子
X? X、1または0回
X* X、0回以上
X+ X、1回以上
X{n} X、正確にn
X{n,} Xn回以上
X{n,m} Xn回以上、m回以下
最短一致数量子
X?? X、1または0回
X*? X、0回以上
X+? X、1回以上
X{n}? X、正確にn
X{n,}? Xn回以上
X{n,m}? Xn回以上、m回以下
強欲な数量子
X?+ X、1または0回
X*+ X、0回以上
X++ X、1回以上
X{n}+ X、正確にn
X{n,}+ Xn回以上
X{n,m}+ Xn回以上、m回以下
論理演算子
XY Xの直後にY
X|Y XまたはY
(X) X、キャプチャリング・グループとして
後方参照
\n マッチしたn番目のキャプチャリング・グループ
\k<name> 「name」がマッチした名前付きキャプチャリング・グループ
引用
\ なし。だが、次の文字を引用する
\Q なし、\Eまでのすべての文字を\Eまで引用します
\E なし、\Qによって開始された引用を終了します
特殊な構文(名前付きキャプチャリングや非キャプチャリング)
(?<name>X) X、名前付きキャプチャリング・グループとして
(?:X) X、非キャプチャリング・グループとして
(?idmsuxU-idmsuxU)  なし。だが、マッチ・フラグi d m s u x Uのオン - オフを切り替える
(?idmsuxU-idmsuxU:X)   X非キャプチャリング・グループとして、特定のフラグi d m s u x Uのオン - オフ
(?=X) X、幅ゼロの肯定先読み
(?!X) X、幅ゼロの否定先読み
(?<=X) X、幅ゼロの肯定後読み
(?<!X) X、幅ゼロの否定後読み
(?>X) X、独立した、非キャプチャリング・グループとして

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

バックスラッシュ文字('\')は、前述の表に定義されているエスケープされた構造体を導入したり、エスケープされていない構造体として解釈される文字を引用符で囲むために使用します。 したがって、式\\は1つのバックスラッシュに一致し、\{は左中カッコに一致します。

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

Javaソース・コードの文字列リテラル内のバックスラッシュは、「Java言語仕様」で必要であると解釈されます。Unicodeエスケープ(セクション3.3)またはその他の文字エスケープ(セクション3.10.6)として解釈されます。 したがって、Javaバイトコード・コンパイラによる解釈から保護するために、正規表現を表す文字列リテラルでバックスラッシュを二重にする必要があります。 たとえば、文字列リテラル"\b"は、正規表現として解釈される場合は1つのバックスペース文字に一致し、"\\b"は単語の境界に一致します。 文字列リテラル"\(hello\)"は不正であり、コンパイル時エラーが発生します。文字列(hello)をマッチするには、文字列リテラル"\\(hello\\)"を使用する必要があります。

文字クラス

文字クラスは、他の文字クラス内に記述でき、結合演算子(暗黙)および交差演算子(&&)で構成できます。 結合演算子は、1つ以上のオペランド・クラスに含まれるすべての文字を含むクラスを表します。 交差演算子は、2つのオペランド・クラスに含まれるすべての文字を含むクラスを表します。

文字クラス演算子は、次の順で優先順位が高くなります。

文字クラス演算子の優先順位。
優先順位
1 リテラル・エスケープ     \x
2 グルーピング [...]
3 範囲 a-z
4 結合 [a-e][i-u]
5 交差 [a-z&&[aeiou]]

実際には、異なるメタキャラクタのセットは、文字クラスの外部ではなく内部に存在することに留意してください。 たとえば、正規表現.は文字クラス内で特殊な意味を失い、式-はメタ文字を形成する範囲になります。

行末記号

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

  • 改行(ライン・フィード)文字('\n')、
  • 改行文字がすぐに続くキャリッジ・リターン文字 ("\r\n")、
  • スタンドアロンのキャリッジ・リターン文字 ('\r')、
  • 次行文字('\u0085')、
  • 行区切り文字('\u2028')、または
  • 段落区切り文字('\u2029')。

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

正規表現.は、DOTALLフラグが指定されていないかぎり、行の終了文字以外の任意の文字と一致します。

MULTILINEモードがアクティブ化されていない場合、正規表現^は行終了文字を無視し、入力シーケンス全体の先頭でのみ一致します。 正規表現$は、入力シーケンス全体の最後に一致しますが、それに続く他の入力文字がない場合は、最後の行の終了文字の直前にも一致します。 その他の行の終端文字は無視されます。その後に他の入力文字が続く場合、最後の終端文字も含まれます。

MULTILINEモードがアクティブになっている場合、^は、入力の最初と、入力の最後以外のすべての行終了文字の後で一致します。 MULTILINEモードの場合、$は、行終了文字の直前または入力シーケンスの終端に一致します。

グループとキャプチャリング

グループ番号

キャプチャリング・グループには、左から右方向に左丸括弧を数えることによって、番号が付けられます。 たとえば、式((A)(B(C)))には、次の4つのグループがあります:

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

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

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

グループ名

キャプチャリング・グループには、"name"、named-capturing group、を割り当てることができ、後で"name"によって逆参照されます。 グループ名は、次の文字で構成されます。 最初の文字はletterである必要があります。

  • 大文字'A'から'Z' ('\u0041'から'\u005a')、
  • 小文字'a'から'z' ('\u0061'から'\u007a')、
  • 数字'0'から'9' ('\u0030'から'\u0039')

named-capturing groupには、引き続き「グループ番号」で説明されているように番号が付けられます。

グループに関連付けられたキャプチャされた入力は常に、グループが最後に一致した部分列です。 数量子によりグループが2回目に評価される場合、前にキャプチャされた値がある場合は、2回目の評価が失敗した場合、その値が保持されます。 文字列"aba"を式(a(b)?)+とマッチします。たとえば、2つのグループを"b"に設定したままにします。 キャプチャされたすべての入力は、各マッチの開始時に破棄されます。

(?で始まるグループは、純粋な「非キャプチャリング」グループで、テキストはキャプチャされず、グループ合計にはカウントされません。または、「名前付きキャプチャリング」グループです。

Unicodeサポート

このクラスは、Unicodeテクニカル標準 #18: Unicode正規表現のレベル1と、RL 2.1標準等価およびRL 2.2拡張書記素クラスタに準拠しています。

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

Unicode文字は、例えば補助文字U+2011Fはなくサロゲート・ペア\uD840 \uDD1Fの二つの連続のUnicodeエスケープ・シーケンス、\x{2011F}として指定することができ、構築物\x{...}に記載の直接ように、その「16進表記法」 (16進コード・ポイント値)を用いて表現することができます。

「Unicode文字の名前」は、名前付き文字構成\N{...}でサポートされます。たとえば、\N{WHITE SMILING FACE}は文字\u263Aを指定します。 このクラスでサポートされている文字名は、Character.codePointOf(name)と一致する有効なUnicode文字名です。

Unicode拡張書記素クラスタは、書記素クラスタマッチャ\Xと対応する境界マッチャ\b{g}によってサポートされています。

Unicodeスクリプト、ブロック、カテゴリおよびバイナリ・プロパティは、Perlと同様に、\pおよび\P構造で記述されます。\p{prop}は、入力にpropプロパティがある場合と一致し、\P{prop}はそのプロパティを持つ場合、一致しません。

スクリプト、ブロック、カテゴリ、およびバイナリ・プロパティは、文字クラスの内部および外部のどちらにも使用できます。

スクリプトは、IsHiraganaのように、接頭辞Isを付けて指定するか、または、script=Hiraganasc=Hiraganaのように、scriptキーワード(またはその短縮形式sc) を使用して指定します。

Patternのサポートする書体名は、UnicodeScript.forNameによって受け入れられ、定義される有効な書体名です。

ブロックは、InMongolianのように、接頭辞Inを付けて指定するか、または、block=Mongolianblk=Mongolianのように、blockキーワード(またはその短縮形式blk)を使用して指定します。

Patternのサポートするブロック名は、UnicodeBlock.forNameによって受け入れられ、定義される有効なブロック名です。

カテゴリはオプションの接頭辞Isによって指定できます。\p{L}\p{IsL}のどちらもUnicode文字のカテゴリを示します。 スクリプトやブロックと同じように、カテゴリもgeneral_category=Lugc=Luのように、キーワードgeneral_category (またはその短縮形式gc)を使用して指定することができます。

サポートされているカテゴリは、Characterクラスで指定されたバージョンのThe Unicode Standardに記載されています。 カテゴリ名については、標準に規準と情報が定義されています。

バイナリ・プロパティは、IsAlphabeticのように、接頭辞Isを使用して指定します。 Patternによってサポートされるバイナリ・プロパティは次のとおりです

  • Alphabetic
  • Ideographic
  • Letter
  • Lowercase
  • Uppercase
  • Titlecase
  • Punctuation
  • Control
  • White_Space
  • Digit
  • Hex_Digit
  • Join_Control
  • Noncharacter_Code_Point
  • Assigned
  • Emoji
  • Emoji_Presentation
  • Emoji_Modifier
  • Emoji_Modifier_Base
  • Emoji_Component
  • Extended_Pictographic

次の「事前定義済の文字クラス」および「POSIX文字クラス」は、UNICODE_CHARACTER_CLASSフラグが指定されている場合、Unicodeテクニカル標準 #18: Unicode正規表現「Annex C: 互換性プロパティ」の推奨事項に準拠しています。

Unicodeモードの定義済のPOSIX文字クラス
クラス マッチ
\p{Lower} 小文字:\p{IsLowercase}
\p{Upper} 大文字:\p{IsUppercase}
\p{ASCII} すべてのASCII文字: [\x00-\x7F]
\p{Alpha} 英字:\p{IsAlphabetic}
\p{Digit} 10進数の文字:\p{IsDigit}
\p{Alnum} 英数字:[\p{IsAlphabetic}\p{IsDigit}]
\p{Punct} 句読記号:\p{IsPunctuation}
\p{Graph} 表示可能な文字: [^\p{IsWhite_Space}\p{gc=Cc}\p{gc=Cs}\p{gc=Cn}]
\p{Print} プリント可能文字: [\p{Graph}\p{Blank}&&[^\p{Cntrl}]]
\p{Blank} 空白またはタブ: [\p{IsWhite_Space}&&[^\p{gc=Zl}\p{gc=Zp}\x0a\x0b\x0c\x0d\x85]]
\p{Cntrl} 制御文字: \p{gc=Cc}
\p{XDigit} 16進数: [\p{gc=Nd}\p{IsHex_Digit}]
\p{Space} 空白文字:\p{IsWhite_Space}
\d 数字: \p{IsDigit}
\D 数字以外: [^\d]
\s 空白文字: \p{IsWhite_Space}
\S 空白以外の文字: [^\s]
\w 単語文字: [\p{Alpha}\p{gc=Mn}\p{gc=Me}\p{gc=Mc}\p{Digit}\p{gc=Pc}\p{IsJoin_Control}]
\W 単語以外の文字: [^\w]

java.lang.Characterブールismethodnameメソッド(非推奨のものを除く)と同様に動作するカテゴリは、指定されたプロパティの名前がjavamethodnameである同じ\p{prop}構文を介して使用できます

Perl 5との比較

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

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

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

  • 文字クラスの結合と交差(前述)。

Perlとの大きな相違点

  • Perlでは、\1から\9までは常に後方参照として解釈されます。9より大きいバックスラッシュ・エスケープされた数値は、少なくとも多くのサブ表現が存在する場合は後方参照として扱われ、存在しない場合は、可能な場合は8進エスケープとして解釈されます。 このクラスでは、8 進数のエスケープは常にゼロで始まります。 このクラスでは、\1から\9までは常に後方参照として解釈され、正規表現のその時点で多くの部分正規表現が存在する場合は、それより大きい数値が後方参照として受け入れられます。それ以外の場合は、数値が既存のグループ数以下または1桁になるまで、パーサーは数値をドロップします。

  • Perlでは、最後のマッチが終了した場所からマッチの再開を要求するときは、gフラグを使用します。 この機能は、Matcherクラスによって暗黙的に提供されます。findメソッドを繰返し呼び出すと、マッチャがリセットされないかぎり、最後のマッチが終了した場所からマッチ操作が再開します。

  • Perl では、表現の最上位に埋め込まれたフラグが表現全体に適用されます。 このクラスの埋込みフラグは、埋め込まれた場所にかかわらず、その箇所でのみ有効になります。フラグがグループ内に埋め込まれている場合は、Perlと同様にグループの最後で復元されます。

  • Perlのフリースペーシング・モード (このクラスではコメント・モードと呼ばれる)は、正規表現の(?x)で (または、式のコンパイル時にCOMMENTSフラグによって)指定されますが、文字クラス内の空白を無視しません。 このクラスでは、コメント・モードの場合に正規表現の一部として考慮されるように、文字クラス内の空白をエスケープする必要があります。

正規表現構造の動作の詳細は、正規表現の習得, 3rd Edition、Jeffrey E. F. Friedl、O 'Reilly and Associates、2006年」を参照してください。

導入されたバージョン:
1.4
外部仕様
関連項目: