Jeff Friesen がJavaWorld Web サイト 用に書いた、Java 言語の正規表現に関する短いガイドの翻訳を紹介します。読みやすくするために、記事をいくつかの部分に分割しました。
Java プログラムでの正規表現 API を使用したパターンの認識と記述
Java の文字およびさまざまな文字列データ型は、パターン マッチングに対する低レベルのサポートを提供しますが、これらをこの目的で使用すると、通常、コードが大幅に複雑になります。Regex API (「正規表現 API」) を使用すると、よりシンプルでパフォーマンスの高いコードが取得されます。このチュートリアルは、正規表現と Regex API を使い始めるのに役立ちます。まず、パッケージ内で最も興味深い 3 つのクラスについて一般的に説明しjava.util.regex
、次にクラスの内部を見てPattern
、その洗練されたパターン マッチング構造を探索します。 注意: この記事のデモ アプリケーションのソース コード (JavaWorld サイト用に Jeff Friesen によって作成) は、ここからダウンロードできます。
正規表現とは何ですか?
正規表現(正規表現/regex/regexp) は、特定の文字列セットを記述するパターンである文字列です。パターンによって、どの行がセットに属するかが決まります。パターンは、リテラルとメタキャラクター、つまり文字通りの意味ではなく特別な意味を持つ文字で構成されます。パターン マッチングは、テキストを検索して一致するもの、つまり正規表現パターンに一致する文字列を見つけることです。Java は、その Regex API を通じてパターン マッチングをサポートします。この API は、パッケージ内にあるPattern
、Matcher
およびの 3 つのクラスで構成されます。 PatternSyntaxException
java.util.regex
- クラス オブジェクト
Pattern
(テンプレートとも呼ばれます) は、コンパイルされた正規表現です。 - クラス オブジェクト
Matcher
(またはマッチャー) は、文字シーケンス (そのクラスがインターフェイスを実装しjava.lang.CharSequence
、テキスト ソースとして機能するオブジェクト) 内で一致を見つけるためのパターン解釈メカニズムです。 - クラス オブジェクトは、
PatternSyntaxException
無効な正規表現パターンを記述するために使用されます。
java.lang.String
。たとえば、この関数は、呼び出し文字列が正規表現と正確に一致する場合にのみboolean matches (String regex)
戻ります。 true
regex
便利な方法 |
---|
matches() クラスのその他の正規表現指向の便利なメソッドは、String Regex API と同様の方法で内部で実装されます。 |
正規表現デモ
Java 正規表現と 、およびのRegexDemo
さまざまなメソッドをデモンストレーションするアプリケーションを作成しました。以下は、このデモ アプリケーションのソース コードです。リスト 1. 正規表現のデモ Pattern
Matcher
PatternSyntaxException
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
public class RegexDemo
{
public static void main(String[] args)
{
if (args.length != 2)
{
System.err.println("usage: java RegexDemo regex input");
return;
}
// Преобразуем символьные последовательности начала новой строки (\n) в символы начала строки.
args[1] = args[1].replaceAll("\\\\n", "\n");
try
{
System.out.println("regex = " + args[0]);
System.out.println("input = " + args[1]);
Pattern p = Pattern.compile(args[0]);
Matcher m = p.matcher(args[1]);
while (m.find())
System.out.println("Found [" + m.group() + "] starting at "
+ m.start() + " and ending at " + (m.end() - 1));
}
catch (PatternSyntaxException pse)
{
System.err.println("Неправильное регулярное выражение: " + pse.getMessage());
System.err.println("Описание: " + pse.getDescription());
System.err.println("Позиция: " + pse.getIndex());
System.err.println("Неправильный шаблон: " + pse.getPattern());
}
}
}
main
クラス メソッドが最初に行うことはRegexDemo
、そのコマンド ラインを確認することです。2 つの引数が必要です。1 つ目は正規表現で、2 つ目は正規表現が検索される入力テキストです。入力テキスト内で改行文字を使用する必要がある場合があります(\n)
。\
これは、文字の後に文字を指定することによってのみ実行できますn
。この関数はmain()
、この文字シーケンスを Unicode 値 10 に変換します。 コードの大部分はRegexDemo
. で囲まれていますtry-catch
。このブロックは、try
まず指定された正規表現と入力テキストを出力し、次にPattern
コンパイルされた正規表現を格納するオブジェクトを作成します (正規表現はパターン マッチングのパフォーマンスを向上させるためにコンパイルされます)。マッチャーはオブジェクトから抽出されPattern
、すべてが見つかるまで繰り返し一致を検索するために使用されます。このブロックは、catch
いくつかのクラス メソッドを呼び出してPatternSyntaxException
、例外に関する有用な情報を取得します。この情報は出力ストリームに順次出力されます。コードがどのように機能するかをまだ詳しく知る必要はありません。記事の後半で API を検討するときに明らかになります。ただし、リスト 1 をコンパイルする必要があります。リスト 1 からコードを取得し、コマンド プロンプトで次のコマンドを入力してコンパイルしますRegexDemo
。 javac RegexDemo.java
Pattern クラスとその構成要素
Pattern
Regex API を構成する 3 つのクラスのうちの最初のクラスであるclass は、正規表現をコンパイルして表現したものです。クラス SDK ドキュメントではPattern
、さまざまな正規表現構成について説明していますが、正規表現を積極的に使用しない場合、このドキュメントの一部がわかりにくい可能性があります。量指定子とは何ですか?また、貪欲な量指定子、消極的な量指定子、所有的な量指定子の違いは何ですか? 文字クラス、境界マッチャー、後方参照、埋め込みフラグ式とは何ですか? これらの質問やその他の質問には、次のセクションで答えます。
リテラル文字列
最も単純な正規表現の構成要素はリテラル文字列です。パターン マッチングが成功するには、入力テキストの一部がその構造のパターンと一致する必要があります。次の例を考えてみましょう。 この例では、入力テキスト内のjava RegexDemo apple applet
パターンの一致を見つけようとしています。次の結果は、見つかった一致を示しています。 apple
applet
regex = apple
input = applet
Found [apple] starting at 0 and ending at 4
出力には正規表現と入力テキストが表示され、apple
アプレットでの検出が成功したことが示されます。さらに、この一致の開始位置と終了位置は、それぞれ と で与えられ0
ます4
。開始位置はテキスト内で一致が見つかった最初の場所を示し、終了位置は一致の最後の点を示します。ここで、次のコマンド ラインを指定したとします。 java RegexDemo apple crabapple
今回は、開始位置と終了位置が異なる次の結果が得られます。
regex = apple
input = crabapple
Found [apple] starting at 4 and ending at 8
それ以外の場合、applet
正規表現としてと をapple
入力テキストとして使用すると、一致するものは見つかりません。正規表現全体が一致する必要がありますが、この場合、入力テキストにはt
afterが含まれませんapple
。
メタキャラクター
さらに興味深い正規表現構造では、リテラル文字とメタ文字が結合されます。たとえば、正規表現 ではa.b
、ドット メタキャラクタはと b(.)
の間の任意の文字を意味しますa
。次の例を考えてみましょう。 java RegexDemo .ox "The quick brown fox jumps over the lazy ox."
この例.ox
では、正規表現とThe quick brown fox jumps over the lazy ox.
入力テキストの両方として使用されています。RegexDemo
任意の文字で始まり、で終わる一致するテキストを検索しますox.
。その実行結果は次のとおりです。
regex = .ox
input = The quick brown fox jumps over the lazy ox.
Found [fox] starting at 16 and ending at 18
Found [ ox] starting at 39 and ending at 41
出力には、fox
and ox
(先頭にスペース文字あり) という 2 つの一致が表示されます。メタキャラクターは、最初の場合は.
文字に一致しf
、2 番目の場合はスペースに一致します。.ox
これをメタキャラクターに置き換えるとどうなりますか.
? つまり、次のコマンド ラインの結果として得られるものです。 java RegexDemo . "The quick brown fox jumps over the lazy ox."
ドット メタキャラクタは任意の文字に一致するため、RegexDemo
入力テキストのすべての文字 (末尾のドット文字を含む) で見つかった一致を出力します。
regex = .
input = The quick brown fox jumps over the lazy ox.
Found [T] starting at 0 and ending at 0
Found [h] starting at 1 and ending at 1
Found [e] starting at 2 and ending at 2
Found [ ] starting at 3 and ending at 3
Found [q] starting at 4 and ending at 4
Found [u] starting at 5 and ending at 5
Found [i] starting at 6 and ending at 6
Found [c] starting at 7 and ending at 7
Found [k] starting at 8 and ending at 8
Found [ ] starting at 9 and ending at 9
Found [b] starting at 10 and ending at 10
Found [r] starting at 11 and ending at 11
Found [o] starting at 12 and ending at 12
Found [w] starting at 13 and ending at 13
Found [n] starting at 14 and ending at 14
Found [ ] starting at 15 and ending at 15
Found [f] starting at 16 and ending at 16
Found [o] starting at 17 and ending at 17
Found [x] starting at 18 and ending at 18
Found [ ] starting at 19 and ending at 19
Found [j] starting at 20 and ending at 20
Found [u] starting at 21 and ending at 21
Found [m] starting at 22 and ending at 22
Found [p] starting at 23 and ending at 23
Found [s] starting at 24 and ending at 24
Found [ ] starting at 25 and ending at 25
Found [o] starting at 26 and ending at 26
Found [v] starting at 27 and ending at 27
Found [e] starting at 28 and ending at 28
Found [r] starting at 29 and ending at 29
Found [ ] starting at 30 and ending at 30
Found [t] starting at 31 and ending at 31
Found [h] starting at 32 and ending at 32
Found [e] starting at 33 and ending at 33
Found [ ] starting at 34 and ending at 34
Found [l] starting at 35 and ending at 35
Found [a] starting at 36 and ending at 36
Found [z] starting at 37 and ending at 37
Found [y] starting at 38 and ending at 38
Found [ ] starting at 39 and ending at 39
Found [o] starting at 40 and ending at 40
Found [x] starting at 41 and ending at 41
Found [.] starting at 42 and ending at 42
メタキャラクターを引用する |
---|
. 正規表現構造で または他のメタキャラクターをリテラル文字として 指定するには、次のいずれかの方法でエスケープする必要があります。
String regex = "\\."; バックスラッシュ (たとえば、\\. または)など、文字列リテラルに含まれる文字を必ず複製してください\\Q.\\E 。コマンドライン引数の一部であるバックスラッシュを重複させないでください。 |
文字クラス
場合によっては、検索する一致を特定の文字セットに制限する必要があります。たとえば、テキスト内で母音a
、e
、i
、o
およびを検索しu
、母音文字が出現するたびに一致とみなされます。このような問題を解決するには、角括弧 ( ) のメタ文字の間にある文字のセットを定義する文字クラスが役に立ちます[ ]
。このクラスはPattern
、単純な文字クラス、範囲クラス、逆クラス、和集合クラス、交差クラス、および減算クラスをサポートします。これからそれらすべてを見ていきます。
単純な文字クラス
単純な文字クラスは、並べて配置された文字で構成され、それらの文字のみに一致します。たとえば、クラスは[abc]
文字a
、b
およびに一致しますc
。次の例を考えてみましょう。 java RegexDemo [csw] cave
結果からわかるように、この例では、c
に一致する文字のみが含まれていますcave
。
regex = [csw]
input = cave
Found [c] starting at 0 and ending at 0
反転文字クラス
反転文字クラスはメタ文字で始まり^
、メタ文字に含まれていない文字のみと一致します。たとえば、このクラスは、と[^abc]
を除くすべての文字に一致します。次の例を考えてみましょう。 私のオペレーティング システム (Windows) では、二重引用符がシェルでエスケープ文字として扱われるため、二重引用符が必要であることに注意してください。ご覧のとおり、この例では、と の文字のみが見つかり、 に一致します。 a
b
c
java RegexDemo "[^csw]" cave
^
a
v
e
cave
regex = [^csw]
input = cave
Found [a] starting at 1 and ending at 1
Found [v] starting at 2 and ending at 2
Found [e] starting at 3 and ending at 3
範囲文字クラス
範囲文字クラスは、ハイフン (-
) で区切られた 2 つの文字で構成されます。ハイフンの左側の文字で始まり、右側の文字で終わるすべての文字が範囲の一部です。たとえば、範囲は[a-z]
すべての小文字のラテン文字に一致します。これは、単純なクラスを定義するのと同じです[abcdefghijklmnopqrstuvwxyz]
。次の例を考えてみましょう。 この例では、に一致するjava RegexDemo [a-c] clown
文字のみが一致します。 c
clown
regex = [a-c]
input = clown
Found [c] starting at 0 and ending at 0
Java の正規表現、パート 2 Java の正規表現、パート 3 Java の正規表現、パート 4 Java の正規表現、パート 5
GO TO FULL VERSION