JavaRush /Java Blog /Random-JA /Java の正規表現、パート 1

Java の正規表現、パート 1

Random-JA グループに公開済み
Jeff Friesen がJavaWorld Web サイト 用に書いた、Java 言語の正規表現に関する短いガイドの翻訳を紹介します。読みやすくするために、記事をいくつかの部分に分割しました。 Java の正規表現、パート 1 - 1

Java プログラムでの正規表現 API を使用したパターンの認識と記述

Java の文字およびさまざまな文字列データ型は、パターン マッチングに対する低レベルのサポートを提供しますが、これらをこの目的で使用すると、通常、コードが大幅に複雑になります。Regex API (「正規表現 API」) を使用すると、よりシンプルでパフォーマンスの高いコードが取得されます。このチュートリアルは、正規表現と Regex API を使い始めるのに役立ちます。まず、パッケージ内で最も興味深い 3 つのクラスについて一般的に説明しjava.util.regex、次にクラスの内部を見てPattern、その洗練されたパターン マッチング構造を探索します。 注意: この記事のデモ アプリケーションのソース コード (JavaWorld サイト用に Jeff Friesen によって作成) は、ここからダウンロードできます。

正規表現とは何ですか?

正規表現(正規表現/regex/regexp) は、特定の文字列セットを記述するパターンである文字列です。パターンによって、どの行がセットに属するかが決まります。パターンは、リテラルとメタキャラクター、つまり文字通りの意味ではなく特別な意味を持つ文字で構成されます。パターン マッチングは、テキストを検索して一致するもの、つまり正規表現パターンに一致する文字列を見つけることです。Java は、その Regex API を通じてパターン マッチングをサポートします。この API は、パッケージ内にあるPatternMatcherおよびの 3 つのクラスで構成されます。 PatternSyntaxExceptionjava.util.regex
  • クラス オブジェクトPattern(テンプレートとも呼ばれます) は、コンパイルされた正規表現です。
  • クラス オブジェクトMatcher(またはマッチャー) は、文字シーケンス (そのクラスがインターフェイスを実装しjava.lang.CharSequence、テキスト ソースとして機能するオブジェクト) 内で一致を見つけるためのパターン解釈メカニズムです。
  • クラス オブジェクトは、PatternSyntaxException無効な正規表現パターンを記述するために使用されます。
Java は、 のさまざまなメソッドを通じてパターン マッチングのサポートも提供します java.lang.String。たとえば、この関数は、呼び出し文字列が正規表現と正確に一致する場合にのみboolean matches (String regex)戻ります。 trueregex
便利な方法
matches()クラスのその他の正規表現指向の便利なメソッドは、StringRegex API と同様の方法で内部で実装されます。

正規表現デモ

Java 正規表現と 、およびのRegexDemoさまざまなメソッドをデモンストレーションするアプリケーションを作成しました。以下は、このデモ アプリケーションのソース コードです。リスト 1. 正規表現のデモ PatternMatcherPatternSyntaxException
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 に変換します。 Java の正規表現、パート 1 - 2コードの大部分はRegexDemo. で囲まれていますtry-catch。このブロックは、tryまず指定された正規表現と入力テキストを出力し、次にPatternコンパイルされた正規表現を格納するオブジェクトを作成します (正規表現はパターン マッチングのパフォーマンスを向上させるためにコンパイルされます)。マッチャーはオブジェクトから抽出されPattern、すべてが見つかるまで繰り返し一致を検索するために使用されます。このブロックは、catchいくつかのクラス メソッドを呼び出してPatternSyntaxException、例外に関する有用な情報を取得します。この情報は出力ストリームに順次出力されます。コードがどのように機能するかをまだ詳しく知る必要はありません。記事の後半で API を検討するときに明らかになります。ただし、リスト 1 をコンパイルする必要があります。リスト 1 からコードを取得し、コマンド プロンプトで次のコマンドを入力してコンパイルしますRegexDemojavac RegexDemo.java

Pattern クラスとその構成要素

PatternRegex API を構成する 3 つのクラスのうちの最初のクラスであるclass は、正規表現をコンパイルして表現したものです。クラス SDK ドキュメントではPattern、さまざまな正規表現構成について説明していますが、正規表現を積極的に使用しない場合、このドキュメントの一部がわかりにくい可能性があります。量指定子とは何ですか?また、貪欲な量指定子、消極的な量指定子、所有的な量指定子の違いは何ですか? 文字クラス、境界マッチャー、後方参照、埋め込みフラグ式とは何ですか? これらの質問やその他の質問には、次のセクションで答えます。

リテラル文字列

最も単純な正規表現の構成要素はリテラル文字列です。パターン マッチングが成功するには、入力テキストの一部がその構造のパターンと一致する必要があります。次の例を考えてみましょう。 この例では、入力テキスト内のjava RegexDemo apple applet パターンの一致を見つけようとしています。次の結果は、見つかった一致を示しています。 appleapplet
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入力テキストとして使用すると、一致するものは見つかりません。正規表現全体が一致する必要がありますが、この場合、入力テキストにはtafterが含まれませんappleJava の正規表現、パート 1 ~ 3

メタキャラクター

さらに興味深い正規表現構造では、リテラル文字とメタ文字が結合されます。たとえば、正規表現 では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
出力には、foxand 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
メタキャラクターを引用する
.正規表現構造で または他のメタキャラクターをリテラル文字として 指定するには、次のいずれかの方法でエスケープする必要があります。
  • バックスラッシュ文字を前に付けます。
  • このメタキャラクタを\Qとの間に配置します\E(たとえば、\Q.\E)。
String regex = "\\.";バックスラッシュ (たとえば、\\.または)など、文字列リテラルに含まれる文字を必ず複製してください\\Q.\\E。コマンドライン引数の一部であるバックスラッシュを重複させないでください。

文字クラス

場合によっては、検索する一致を特定の文字セットに制限する必要があります。たとえば、テキスト内で母音aeioおよびを検索しu、母音文字が出現するたびに一致とみなされます。このような問題を解決するには、角括弧 ( ) のメタ文字の間にある文字のセットを定義する文字クラスが役に立ちます[ ]。このクラスはPattern、単純な文字クラス、範囲クラス、逆クラス、和集合クラス、交差クラス、および減算クラスをサポートします。これからそれらすべてを見ていきます。

単純な文字クラス

単純な文字クラスは、並べて配置された文字で構成され、それらの文字のみに一致します。たとえば、クラスは[abc]文字abおよびに一致しますc。次の例を考えてみましょう。 java RegexDemo [csw] cave 結果からわかるように、この例では、cに一致する文字のみが含まれていますcave
regex = [csw]
input = cave
Found [c] starting at 0 and ending at 0

反転文字クラス

反転文字クラスはメタ文字で始まり^、メタ文字に含まれていない文字のみと一致します。たとえば、このクラスは、と[^abc]を除くすべての文字に一致します。次の例を考えてみましょう。 私のオペレーティング システム (Windows) では、二重引用符がシェルでエスケープ文字として扱われるため、二重引用符が必要であることに注意してください。ご覧のとおり、この例では、と の文字のみが見つかり、 に一致します。 abcjava RegexDemo "[^csw]" cave^avecave
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 文字のみが一致します。 cclown
regex = [a-c]
input = clown
Found [c] starting at 0 and ending at 0
Java の正規表現、パート 2 Java の正規表現、パート 3 Java の正規表現、パート 4 Java の正規表現、パート 5
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION