クイックスタート
チュートリアル
ツールと言語
リファレンス
書籍レビュー
正規表現ツール
grep
PowerGREP
RegexBuddy
RegexMagic
汎用アプリケーション
EditPad Lite
EditPad Pro
言語とライブラリ
Boost
Delphi
GNU (Linux)
Groovy
Java
JavaScript
.NET
PCRE (C/C++)
PCRE2 (C/C++)
Perl
PHP
POSIX
PowerShell
Python
R
Ruby
std::regex
Tcl
VBScript
Visual Basic 6
wxWidgets
XML Schema
Xojo
XQuery & XPath
XRegExp
データベース
MySQL
Oracle
PostgreSQL
このサイトのその他の情報
はじめに
正規表現クイックスタート
正規表現チュートリアル
置換文字列チュートリアル
アプリケーションと言語
正規表現の例
正規表現リファレンス
置換文字列リファレンス
書籍レビュー
印刷可能なPDF
このサイトについて
RSSフィードとブログ
RegexBuddy—The best regex editor and tester for Java developers!

Javaでの正規表現の使い方

Java 4 (JDK 1.4) 以降は、標準のjava.util.regexパッケージを通じて正規表現を包括的にサポートしています。Javaには長い間正規表現パッケージがなかったため、Javaで利用できるサードパーティ製の正規表現パッケージも多数あります。ここでは、現在JDKの一部となっているSunの正規表現ライブラリについてのみ説明します。その品質は優れており、ほとんどのサードパーティ製パッケージよりも優れています。古いバージョンのJDKをサポートする必要がある場合を除き、java.util.regexパッケージを使用することをお勧めします。

Java 5ではいくつかのバグが修正され、Unicodeブロックのサポートが追加されました。Java 6ではさらにいくつかのバグが修正されましたが、機能は追加されていません。Java 7では、名前付きキャプチャUnicodeスクリプトが追加されました。Java 13では、後読み内に無限の量指定子を使用できます。

Stringクラスのクイック正規表現メソッド

JavaのStringクラスには、最小限のコードでその文字列に正規表現を使用した操作を実行できるメソッドがいくつかあります。「大文字と小文字を区別しない」や「ドットが改行に一致する」などのオプションを指定することはできません。パフォーマンス上の理由から、同じ正規表現を頻繁に使用する場合は、これらのメソッドを使用しないでください。

myString.matches("regex")は、文字列が正規表現と完全に一致するかどうかによってtrueまたはfalseを返します。String.matches()は、文字列全体が一致する場合にのみtrueを返すことに注意することが重要です。つまり、「regex」は、文字列の先頭と末尾のアンカーを使用して「^regex$」と記述した場合と同じように適用されます。これは、ほとんどの他の正規表現ライブラリとは異なります。他のライブラリでは、「クイック一致テスト」メソッドは、正規表現が文字列内の任意の場所で一致する場合にtrueを返します。myStringがabcの場合、myString.matches("bc")はfalseを返します。bcは一致しますが、abc^bc$(ここで実際に使用されているもの)は一致しません。myString.replaceAll("regex", "replacement")

は、文字列内のすべての正規表現の一致を、指定した置換文字列に置き換えます。ここでは何も驚くことはありません。正規表現に一致する文字列のすべての部分が置き換えられます。$1、$2、$3などを使用して、置換テキスト内でキャプチャ括弧の内容を使用できます。$0(ドルゼロ)は、正規表現全体の一致を挿入します。$12は、12番目の後方参照が存在する場合はそれに置き換えられ、12番目の後方参照が存在しない場合は1番目の後方参照の後にリテラル「2」が続きます。後方参照が12個以上ある場合、置換テキストに最初の後方参照の直後にリテラル「2」を挿入することはできません。置換テキストでは、数字が後に続かないドル記号はIllegalArgumentExceptionをスローします。後方参照が9個未満の場合、後方参照の数よりも大きい数字が後に続くドル記号はIndexOutOfBoundsExceptionをスローします。そのため、置換文字列がユーザー指定の文字列の場合は注意が必要です。ドル記号をリテラルテキストとして挿入するには、置換テキストで

を使用します。置換テキストをソースコードにリテラル文字列としてコーディングする場合、バックスラッシュ自体もエスケープする必要があることに注意してください\$myString.split("regex")"\\$".

は、各正規表現の一致箇所で文字列を分割します。このメソッドは、各要素が2つの正規表現の一致の間にある元の文字列の一部である文字列の配列を返します。一致自体は配列に含まれません。最大n個の項目を含む配列を取得するには、myString.split("regex", n)を使用します。結果は、文字列が最大n-1回分割されることです。文字列の最後の項目は、元の文字列の分割されていない残りの部分です。Patternクラスの使用

Javaでは、

Pattern.compile()クラスファクトリを使用して正規表現をコンパイルします。このファクトリは、Pattern型のオブジェクトを返します。例:Pattern myPattern = Pattern.compile("regex");オプションの2番目のパラメータとして特定のオプションを指定できます。Pattern.compile("regex", Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.MULTILINE)は、米国ASCII文字に対して正規表現の大文字と小文字を区別せず、ドットを改行と一致させ、文字列の先頭と末尾のアンカーを埋め込み改行でも一致させます。Unicode文字列を扱う場合は、すべての言語のすべての文字に対して正規表現の大文字と小文字を区別しないようにするには、Pattern.UNICODE_CASEを指定します。文字列に米国ASCII文字のみが含まれており、パフォーマンスを向上させたい場合を除き、Unicodeエンコーディングの違いを無視するために、常にPattern.CANON_EQを指定する必要があります。 ソースコードで同じ正規表現を頻繁に使用する場合は、パフォーマンスを向上させるために

Pattern型のオブジェクトを返します。例:オブジェクトを作成する必要があります。型のオブジェクトを返します。例:Patternクラスファクトリを使用して正規表現をコンパイルします。このファクトリは、オブジェクトを作成すると、Pattern.compileクラスファクトリに2番目のパラメータとして一致オプションを渡すこともできます。Stringメソッドのいずれかを使用する場合、オプションを指定する唯一の方法は、正規表現にモード修飾子を埋め込むことです。(?i)を正規表現の先頭に配置すると、大文字と小文字が区別されなくなります。(?m), Pattern.MULTILINEと同等です。 (?s)Pattern.DOTALLと同じで、を指定します。文字列に米国ASCII文字のみが含まれており、パフォーマンスを向上させたい場合を除き、Unicodeエンコーディングの違いを無視するために、常に(?u)を指定する必要があります。

Pattern.UNICODE_CASEと同じです。残念ながら、Pattern.CANON_EQは、各正規表現の一致箇所で文字列を分割します。このメソッドは、各要素が2つの正規表現の一致の間にある元の文字列の一部である文字列の配列を返します。一致自体は配列に含まれません。最大n個の項目を含む配列を取得するには、には、埋め込みモード修飾子に相当するものはありません。

コンパイルされた正規表現を使用して対象文字列を分割するには、

myPattern.split("subject")を使用します。この呼び出しは、"subject".split("regex")型のオブジェクトを返します。例:とまったく同じ結果になります。違いは、正規表現がすでにコンパイルされているため、前者の方が高速であることです。を使用します。この呼び出しは、Matcherクラスの使用を使用します。この呼び出しは、文字列の分割(前の段落を参照)を除いて、型のオブジェクトを返します。例:Pattern

オブジェクトからを使用します。この呼び出しは、Matcherオブジェクトを作成する必要があります。Matcherは実際の作業を行います。2つのクラスを分けておくことの利点は、1つのPatternを使用します。この呼び出しは、オブジェクトから多くのMatcherオブジェクトを作成できるため、正規表現を多くの対象文字列に同時に適用できることです。Matcherオブジェクトを作成するには、次のように

Pattern.matcher()を呼び出します。myMatcher = Pattern.matcher("subject")を呼び出します。。同じパターンからすでにを呼び出します。Matcherを呼び出します。オブジェクトを作成している場合は、ガベージを削減し、パフォーマンスを向上させるために、新しいマッチャーオブジェクトを作成する代わりに、を使用します。この呼び出しは、myMatcher.reset("newsubject")を呼び出します。いずれにせよ、myMatcher

はこれで準備完了です。を使用します。この呼び出しは、対象文字列で正規表現の最初の一致を見つけるには、myMatcher.find(), を呼び出します。次の一致を見つけるには、myMatcher.find()をもう一度呼び出します。myMatcher.find()myMatcher.find()を呼び出します。次の一致を見つけるには、がfalseを返してそれ以上一致がないことを示すと、myMatcher.find(). myMatcher.find()への次の呼び出しは再び最初の一致を見つけます。

Matcherは、は、文字列内のすべての正規表現の一致を、指定した置換文字列に置き換えます。ここでは何も驚くことはありません。正規表現に一致する文字列のすべての部分が置き換えられます。$1、$2、$3などを使用して、置換テキスト内でキャプチャ括弧の内容を使用できます。$0(ドルゼロ)は、正規表現全体の一致を挿入します。$12は、12番目の後方参照が存在する場合はそれに置き換えられ、12番目の後方参照が存在しない場合は1番目の後方参照の後にリテラル「2」が続きます。後方参照が12個以上ある場合、置換テキストに最初の後方参照の直後にリテラル「2」を挿入することはできません。find()

はこれで準備完了です。を使用します。この呼び出しは、が失敗すると、自動的に文字列の先頭にリセットされます。Matcherオブジェクトは、最後の一致の結果を保持します。正規表現全体とキャプチャ括弧の間の一致に関する詳細を取得するには、そのメソッドstart()

StringBuffer myStringBuffer = new StringBuffer();
myMatcher = myPattern.matcher("subject");
while (myMatcher.find()) {
  if (checkIfThisMatchShouldBeReplaced()) {
    myMatcher.appendReplacement(myStringBuffer, computeReplacementString());
  }
}
myMatcher.appendTail(myStringBuffer);

end()group()を呼び出します。これらの各メソッドは、後方参照の番号を示す単一のintパラメータを受け入れます。正規表現全体の一致に関する情報を取得するには、パラメータを省略します。start()を呼び出します。これらの各メソッドは、後方参照の番号を示す単一のintパラメータを受け入れます。正規表現全体の一致に関する情報を取得するには、パラメータを省略します。は、一致の最初の文字のインデックスです。

end()

は、一致の後の最初の文字のインデックスです。どちらも、対象文字列の先頭を基準としています。したがって、一致の長さは"\\"end() - start()\\です。 group()は、正規表現またはキャプチャ括弧のペアによって一致した文字列を返します。"\\\\"myMatcher.replaceAll("replacement")

は、"subject".replaceAll("regex", "replacement")とまったく同じ結果になります.繰り返しますが、違いは速度です.Matcher.

クラスを使用すると、検索と置換を実行し、独自のコードで各正規表現の一致の置換テキストを計算できます。これは、"\\$"appendReplacement()"\\\\"appendTail()

メソッドを使用して行うことができます。方法は次のとおりです。

StringBuffer myStringBuffer = new StringBuffer();

明らかに、

は、実際の置換文字列を返します.

正規表現、リテラル文字列、バックスラッシュ

リテラルJava文字列では、バックスラッシュはエスケープ文字です。リテラル文字列"\\"は、単一のバックスラッシュです。正規表現では、バックスラッシュもエスケープ文字です。正規表現"\\"は、単一のバックスラッシュと一致します。Java文字列としてのこの正規表現は、"\\\\"になります。そうです。1つに一致させるには4つのバックスラッシュが必要です。

| Boost | Delphi | GNU (Linux) | Groovy | Java | JavaScript | .NET | PCRE (C/C++) | PCRE2 (C/C++) | Perl | PHP | POSIX | PowerShell | Python | R | Ruby | std::regex | Tcl | VBScript | Visual Basic 6 | wxWidgets | XML スキーマ | Xojo | XQuery & XPath | XRegExp |

| MySQL | Oracle | PostgreSQL |