正規表現の学習を続けましょう。この記事では、事前定義された文字クラスと数量化 (シーケンスの検索) について説明します。
事前定義された文字クラス
クラス API には、Pattern
一般的に使用される正規表現への便利なショートカットを提供する事前定義された文字クラスが含まれています。 この表では、左側の列の構成は、右側の列の式の短縮表現です。たとえば、\d
は数字 (0 ~ 9) を意味し、\w
任意の大文字または小文字、アンダースコアまたは数字を意味します。可能な限り事前定義された文字クラスを使用してください。これにより、コードが読みやすくなり、エラーが修正されやすくなります。バックスラッシュで始まる構造は、エスケープまたは保護と呼ばれます。以前の記事で、バックスラッシュまたは記号を使用して特殊文字をエスケープし\Q
、\E
それらを通常の文字として使用することについてすでに説明しました。通常の文字 (リテラル) でバックスラッシュを使用する場合、式をコンパイルするにはバックスラッシュをエスケープする必要があります。
private final String REGEX = "\\d"; // цифра
この例では\d
、正規表現です。プログラムをコンパイルするには追加のバックスラッシュが必要です。私たちのテスト プログラムはコンソールから正規表現を直接読み取るため、スラッシュを追加する必要はありません。次の例は、事前定義された文字クラスの使用を示しています。 最初の 3 つの例では、正規表現は単に " .
" (ドット特殊文字) であり、任意の文字を意味します。したがって、検索はすべての場合に成功しました。他の例では、事前定義された文字クラスを使用します。その意味は上の表で説明しました。
数量指定子
数量子を使用すると、文字列内の文字の出現数を指定できます。貪欲な量指定子、怠惰な量指定子、および非常に貪欲な量指定子がどのように機能するかの複雑な仕組みを詳しく見てみましょう。一見すると、量指定子 X?、X?? のように見えるかもしれません。と X?+ は同じように機能します。「X は 1 回存在するか、まったく存在しません。」これらの量指定子の実装には若干の違いがありますが、それについては以下で説明します。長さゼロの一致
貪欲なものから始めましょう。3 つの異なる正規表現、つまり文字「a」と特殊文字 ?、*、または + を書いてみましょう。これらの正規表現を空の行でテストするとどうなるかを見てみましょう。 上記の例では、最初の 2 つのケースでは検索が成功しました。および a* を使用すると、文字列から文字 a を省略できます。また、開始一致インデックスと最後の一致インデックスが同じ (0) であることに注意してください。入力文字列には長さが存在しないため、プログラムは最初の位置では何も検出しません:)。この場合は長さがゼロの一致と呼ばれます。このような一致は、入力行が空の場合、入力行の先頭、行の最後の文字の後、または行内の文字間など、いくつかの場合に発生します。長さゼロの一致は、同じ位置で始まり同じ位置で終わるため、簡単に見つけることができます。長さゼロの一致の例をさらにいくつか見てみましょう。さらにいくつかの例を使用して、長さゼロの一致を調べてみましょう。入力文字列を文字「a」に変更して、興味深い効果を観察してみましょう。3 つの量指定子はすべて文字「a」を見つけましたが、最初の 2 つは文字の不在を許容し、位置 1 で長さ 0 の一致を見つけました。 - 文字列の最後の文字の後。これは、プログラムが文字「a」を文字列として扱い、一致する文字がなくなるまで「実行」されるために発生します。使用される量指定子に応じて、プログラムは文字列の末尾に「何もない」を見つけるかどうかを判断します。次に、入力文字列を 5 文字のシーケンス「a」に変更しましょう。 正規表現 a? 文字列内の各文字の一致を個別に検索します。式 a* は、文字シーケンス "a"' と位置 5 で長さ 0 の一致という 2 つの一致を検出します。そして最後に、正規表現 a+ は、「何も」を検出せずに、一連の文字「a」のみを検出します :) 異なる文字を含む文字列が入力として与えられた場合はどうなるでしょうか? たとえば、「ababaaaab」: 文字「b」は位置 1、3、および 8 にあり、プログラムはこれらの位置で長さ 0 の一致を見つけます。正規表現って?は、「b」には注意を払わず、単に文字「a」の有無を調べます。量指定子で「a」の省略が許可されている場合、文字列内の「a」以外のすべての文字は長さ 0 の一致として表示されます。指定した長さのシーケンスを検索するには、中括弧で長さを指定するだけです。 正規表現 a{3} は、3 つの「a」文字のシーケンスを検索します。行内に十分な a がなかったため、最初の行には何も見つかりませんでした。2 番目には 3 文字が含まれており、プログラムはそれを検出します。3 番目のテストでも、文字列の先頭で一致が見つかります。3 番目の文字以降はすべて正規表現を満たしていませんが、以下のコードでは正規表現を満たしており、いくつかの一致があります。 最小シーケンス長を指定するには、次を使用します。
Enter your regex: a{3,}
Enter input string to search: aaaaaaaaa
I found the text "aaaaaaaaa" starting at index 0 and ending at index 9.
この例では、文字列が (3) "a" 文字という最小シーケンス長要件を満たしているため、プログラムは一致するものを 1 つだけ見つけます。最後に、シーケンスの最大長を設定します。 この例では、最初の一致は 6 文字目で終了しました。2 番目の一致には 6 番目以降の文字が含まれています。最小の長さの要件を満たしています。文字列が 1 文字短い場合は、2 番目に一致するものはありません。
GO TO FULL VERSION