Tìm số lớn nhất trong 3 số java

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

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

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

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

ただし、マッチを繰り返す場合は、コンパイル済みのパターンを再利用できないため、効率が低下します。

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

正規表現構文のサマリー

構文 マッチ 文字 x 文字x \ バックスラッシュ文字 n 8進値0nを持つ文字(0 <= n <= 7) nn 8進値0nnを持つ文字(0 <= n <= 7) mnn 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 <=&nbsp Character.MAX_CODE_POINT) 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]] a – z (bとcを除く): [ad-z] (減算) [a-z&&[^m-p]] a – z (m – pを除く): [a-lq-z] (減算) 定義済みの文字クラス . 任意の文字(行末記号とマッチする場合もある) d 数字: [0-9] D 数字以外: [^0-9] h 水平方向の空白文字: [ txA0u1680u180eu2000-u200au202fu205fu3000] H 水平方向以外の空白文字: [^h] s 空白文字: [tnx0Bfr] S 非空白文字: [^s] v 垂直方向の空白文字: [nx0Bfrx85u2028u2029] V 垂直方向以外の空白文字: [^v] 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} 句読文字: One of !”#$%&'()*+,-./:;<=>?@[]^_`{|}~ p{Graph} 表示できる文字: [p{Alnum}p{Punct}] p{Print} プリント可能文字: [p{Graph}x20] p{Blank} 空白またはタブ: [t] p{Cntrl} 制御文字: [x00-x1Fx7F] p{XDigit} 16進数字: [0-9a-fA-F] p{Space} 空白文字: [tnx0Bfr] 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 単語境界 B 非単語境界 A 入力の先頭 G 前回のマッチの末尾 Z 最後の行末記号がある場合は、それを除く入力の末尾 z 入力の末尾 改行正規表現エンジン R すべてのUnicode改行シーケンスは、u000Du000A|[u000Au000Bu000Cu000Du0085u2028u2029] に等しい 最長一致数量子 X? X、1または0回 X* X、0回以上 X+ X、1回以上 X{n} XnX{n,} Xn回以上 X{n,m} Xn回以上、m回以下 最短一致数量子 X?? X、1または0回 X*? X、0回以上 X+? X、1回以上 X{n}? XnX{n,}? Xn回以上 X{n,m}? Xn回以上、m回以下 強欲な数量子 X?+ X、1または0回 X*+ X、0回以上 X++ X、1回以上 X{n}+ XnX{n,}+ Xn回以上 X{n,m}+ Xn回以上、m回以下 論理演算子 XY Xの直後にY X|Y XまたはY (X) X、前方参照を行う正規表現グループ 前方参照 n マッチしたn番目の前方参照を行う正規表現グループ k<name> 「名前」がマッチした名前付きの前方参照を行うグループ 引用 なし。だが、次の文字をエスケープする Q なし。だが、Eまでのすべての文字をエスケープする E なし。だが、Qで開始された引用をエスケープする 特殊な構文(名前付きの前方参照や前方参照を行わない) (?<name>X) X、名前付きの前方参照を行う正規表現グループ (?:X) X、前方参照を行わない正規表現グループ (?idmsuxU-idmsuxU) なし。だが、マッチ・フラグi d m s u x Uのオン/オフを切り替える (?idmsux-idmsux:X) X、前方参照を行わないグループ。指定されたフラグi d m s u xのオン/オフを切り替える (?=X) X、幅ゼロの肯定先読み (?!X) X、幅ゼロの否定先読み (?<=X) X、幅ゼロの肯定後読み (?<!X) X、幅ゼロの否定後読み (?>X) X、独立した前方参照を行わない正規表現グループ

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

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

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

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

文字クラス

文字クラスは、ほかの文字クラス内に指定したり、結合演算子(暗黙的)や交差演算子(&&)を使用して作成することができます。結合演算子は、1つ以上のオペランド・クラスに含まれるすべての文字を含むクラスを表します。交差演算子は、2つのオペランド・クラスに含まれるすべての文字を含むクラスを表します。

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

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

行末記号

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

  • 改行(ライン・フィード)文字 (「n」)
  • 直後に改行文字が付いたキャリッジ・リターン文字 (「rn」)
  • 単独のキャリッジ・リターン文字 (「r」)
  • 次行文字 (「u0085」)
  • 行区切り文字 (「u2028」)
  • 段落区切り文字 (「u2029」)。

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

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

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

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

グループ番号

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

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

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

グループ名

前方参照を行う正規表現グループには「名前」を割り当てることもでき(名前付きの前方参照を行う正規表現グループ)、あとで「名前」によって後方参照できます。グループ名は、次の文字で構成されます。最初の文字は英字である必要があります。

  • 大文字の’A’ – ‘Z’ (‘u0041’ – ‘u005a’)、
  • 小文字の’a’ – ‘z’ (‘u0061’ – ‘u007a’)、
  • 数字の’0′ – ‘9’ (‘u0030’ – ‘u0039’)、

名前付きの前方参照を行う正規表現グループも、グループ番号で説明するように番号付けされます。

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

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

Unicodeサポート

このクラスは、『Unicode Technical Standard#18: Unicode Regular Expression』(ユニコード・テクニカル・スタンダードNo.18: ユニコード正規表現ガイドライン)のLevel 1および、リリース2.1『Canonical Equivalents』(正規等価)に適合しています。

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

Unicode文字は、コンストラクトx{…}で説明するように、その16進表記 (16進コード・ポイント値)を直接使用して、正規表現でも表すことができます。たとえば、補助文字U+2011Fは、サロゲート・ペアuD840uDD1Fの2つの連続するUnicodeエスケープ・シーケンスの代わりに、x{2011F}と指定できます。

Unicode書体、ブロック、カテゴリ、およびバイナリ・プロパティは、Perlと同様にpおよびP構文で記述します。入力にプロパティpropが含まれる場合、p{prop}はマッチしますが、P{prop}はマッチしません。

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

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

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

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

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

カテゴリはオプションの接頭辞Isによって指定できます。p{L}とp{IsL}のどちらもUnicode文字のカテゴリを示します。書体やブロックと同じように、カテゴリもgeneral_category=Luやgc=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

次の定義済の文字クラスPOSIX文字クラスは、UNICODE_CHARACTER_CLASSフラグが指定されている場合、Unicode正規表現付録C: 互換性プロパティの勧告に適合しています。

クラス マッチ 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}x0ax0bx0cx0dx85]] 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]

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

Perl 5との比較

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

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

  • 定義済みの文字クラス(Unicode文字)

    X Unicode 拡張書記素クラスタに一致

  • 後方参照構文、n番目の前方参照を行う正規表現グループの場合g{n}、名前付きの前方参照を行う正規表現グループの場合g{名前}。

  • 名前付きの文字構文、その名前によるUnicode文字の場合N{名前}。

  • 条件付き構文(?(条件)X)および(?(条件)X|Y)

  • 埋込みコード構文(?{コード})および(??{コード})

  • 埋込みコメント構文(?#comment)

  • プリプロセス演算l u、L、およびU。

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

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

Perlとの大きな相違点

  • Perlでは、1から9は常に前方参照と解釈される。9を超える数字がバックスラッシュでエスケープされているときは、対応する数の部分パターンが存在する場合、前方参照とみなされる。存在しない場合は、8進数のエスケープ(可能な場合)とみなされる。このクラスでは、8 進数のエスケープは常にゼロで始まる。1 – 9は、常に前方参照と解釈される。それより大きい数字は、正規表現のその箇所に対応する数の部分パターンが存在する場合は、前方参照とみなされる。存在しない場合は、その数字が既存のグループ番号以下になるか、1桁の数字になるまで、桁が減らされる。

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

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

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

Related Posts