JavaRush /Java Blog /Random-JA /Java の正規表現の基礎。パート 3
articles
レベル 15

Java の正規表現の基礎。パート 3

Random-JA グループに公開済み
正規表現の学習を続けましょう。この記事では、事前定義された文字クラスと数量化 (シーケンスの検索) について説明します。 Java の正規表現の基礎。 パート 3 - 1

事前定義された文字クラス

クラス API には、Pattern一般的に使用される正規表現への便利なショートカットを提供する事前定義された文字クラスが含まれています。 Java の正規表現の基礎。 パート 3 - 2この表では、左側の列の構成は、右側の列の式の短縮表現です。たとえば、\dは数字 (0 ~ 9) を意味し、\w任意の大文字または小文字、アンダースコアまたは数字を意味します。可能な限り事前定義された文字クラスを使用してください。これにより、コードが読みやすくなり、エラーが修正されやすくなります。バックスラッシュで始まる構造は、エスケープまたは保護と呼ばれます。以前の記事で、バックスラッシュまたは記号を使用して特殊文字をエスケープし\Q\Eそれらを通常の文字として使用することについてすでに説明しました。通常の文字 (リテラル) でバックスラッシュを使用する場合、式をコンパイルするにはバックスラッシュをエスケープする必要があります。

private final String REGEX = "\\d"; // цифра
この例では\d、正規表現です。プログラムをコンパイルするには追加のバックスラッシュが必要です。私たちのテスト プログラムはコンソールから正規表現を直接読み取るため、スラッシュを追加する必要はありません。次の例は、事前定義された文字クラスの使用を示しています。 Java の正規表現の基礎。 パート 3 - 3Java の正規表現の基礎。 パート 3 ~ 4最初の 3 つの例では、正規表現は単に " ." (ドット特殊文字) であり、任意の文字を意味します。したがって、検索はすべての場合に成功しました。他の例では、事前定義された文字クラスを使用します。その意味は上の表で説明しました。

数量指定子

Java の正規表現の基礎。 パート 3 ~ 4数量子を使用すると、文字列内の文字の出現数を指定できます。貪欲な量指定子、怠惰な量指定子、および非常に貪欲な量指定子がどのように機能するかの複雑な仕組みを詳しく見てみましょう。一見すると、量指定子 X?、X?? のように見えるかもしれません。と X?+ は同じように機能します。「X は 1 回存在するか、まったく存在しません。」これらの量指定子の実装には若干の違いがありますが、それについては以下で説明します。

長さゼロの一致

貪欲なものから始めましょう。3 つの異なる正規表現、つまり文字「a」と特殊文字 ?、*、または + を書いてみましょう。これらの正規表現を空の行でテストするとどうなるかを見てみましょう。 Java の正規表現の基礎。 パート 3 ~ 5上記の例では、最初の 2 つのケースでは検索が成功しました。および a* を使用すると、文字列から文字 a を省略できます。また、開始一致インデックスと最後の一致インデックスが同じ (0) であることに注意してください。入力文字列には長さが存在しないため、プログラムは最初の位置では何も検出しません:)。この場合は長さがゼロの一致と呼ばれます。このような一致は、入力行が空の場合、入力行の先頭、行の最後の文字の後、または行内の文字間など、いくつかの場合に発生します。長さゼロの一致は、同じ位置で始まり同じ位置で終わるため、簡単に見つけることができます。長さゼロの一致の例をさらにいくつか見てみましょう。さらにいくつかの例を使用して、長さゼロの一致を調べてみましょう。入力文字列を文字「a」に変更して、興味深い効果を観察してみましょう。3 Java の正規表現の基礎。 パート 3 ~ 6つの量指定子はすべて文字「a」を見つけましたが、最初の 2 つは文字の不在を許容し、位置 1 で長さ 0 の一致を見つけました。 - 文字列の最後の文字の後。これは、プログラムが文字「a」を文字列として扱い、一致する文字がなくなるまで「実行」されるために発生します。使用される量指定子に応じて、プログラムは文字列の末尾に「何もない」を見つけるかどうかを判断します。次に、入力文字列を 5 文字のシーケンス「a」に変更しましょう。 Java の正規表現の基礎。 パート 3 ~ 7正規表現 a? 文字列内の各文字の一致を個別に検索します。式 a* は、文字シーケンス "a"' と位置 5 で長さ 0 の一致という 2 つの一致を検出します。そして最後に、正規表現 a+ は、「何も」を検出せずに、一連の文字「a」のみを検出します :) 異なる文字を含む文字列が入力として与えられた場合はどうなるでしょうか? たとえば、「ababaaaab」: Java の正規表現の基礎。 パート 3 ~ 8文字「b」は位置 1、3、および 8 にあり、プログラムはこれらの位置で長さ 0 の一致を見つけます。正規表現って?は、「b」には注意を払わず、単に文字「a」の有無を調べます。量指定子で「a」の省略が許可されている場合、文字列内の「a」以外のすべての文字は長さ 0 の一致として表示されます。指定した長さのシーケンスを検索するには、中括弧で長さを指定するだけです。 Java の正規表現の基礎。 パート 3 ~ 9正規表現 a{3} は、3 つの「a」文字のシーケンスを検索します。行内に十分な a がなかったため、最初の行には何も見つかりませんでした。2 番目には 3 文字が含まれており、プログラムはそれを検出します。3 番目のテストでも、文字列の先頭で一致が見つかります。3 番目の文字以降はすべて正規表現を満たしていませんが、以下のコードでは正規表現を満たしており、いくつかの一致があります。 Java の正規表現の基礎。 パート 3 ~ 10最小シーケンス長を指定するには、次を使用します。

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 つだけ見つけます。最後に、シーケンスの最大長を設定します。 Java の正規表現の基礎。 パート 3 ~ 11この例では、最初の一致は 6 文字目で終了しました。2 番目の一致には 6 番目以降の文字が含まれています。最小の長さの要件を満たしています。文字列が 1 文字短い場合は、2 番目に一致するものはありません。

量指定子を使用した文字グループとクラスの使用

ここまで、同じ文字を含む文字列に対して量指定子をテストしてきました。量指定子は 1 つの文字にのみ適用されるため、正規表現「abc+」は「ab」と「c」を含む文字列に 1 回以上一致します。「abc」を 1 回以上意味するわけではありません。ただし、数量指定子は、[abc]+ (a または b または c、1 回以上) または (abc)+ (「abc」を 1 回以上) のように、グループおよび文字クラスと組み合わせて使用​​できます。文字のグループ (犬) を 1 行に 3 回見つけてみましょう。 Java の正規表現の基礎。 パート 3 ~ 12最初の例では、プログラムは一致するものを見つけます。数量詞は文字のグループまで拡張されます。括弧を削除すると、量指定子 {3} は文字「g」にのみ適用されます。文字クラスで量指定子を使用することもできます。 Java の正規表現の基礎。 パート 3 ~ 13{3} 量指定子は、最初の例では括弧内の文字クラスに適用され、2 番目の例では文字「c」のみに適用されます。

貪欲な量指定子、怠惰な量指定子、および過剰な貪欲な量指定子の違い

貪欲な量化詞、消極的な量化詞、所有的な量化詞の間にはわずかな違いがあります。貪欲量指定子は、可能な限り最長の一致を見つけようとするため、そのように名付けられました。プログラムは、まず文字列全体を「食べ」ようとし、一致が見つからない場合は、1 文字が破棄され、一致が見つかるまで検索が繰り返されます。もう文字は残りません。一方、怠け者は行頭から始めて、一致する文字が見つかるまで次から次へと文字を追加していきます。最後に、jeety quantification は、greedy のように文字を削除せずに、文字列全体を 1 回スキャンします。デモのために、文字列 xfooxxxxxxfoo を使用します。 Java の正規表現の基礎。 パート 3 ~ 14最初の例では、greedy .* 数量子を使用して、任意の文字を 0 回以上検索し、その後に文字「f」「o」「o」が続きます。Cantifier は貪欲であるため、見つかった一致には文字列全体が含まれます。貪欲量指定子は、文字列内のすべての一致を見つけることはできません。最初のステップでは、文字列全体をスキャンした後、一致するものを見つけてジョブを終了します。2 番目の例は遅延型で、行の先頭から開始して 1 文字ずつ追加します。プログラムは「空」をチェックすることから始まりますが、シーケンス「foo」が行の先頭にない場合、文字「x」を追加して検索が続行され、その後、インデックス 0 と 4 の間で最初の一致が見つかります。検索は行の終わりまで続行されます。 2 番目の一致はインデックス 4 と 13 の間で見つかります。3 番目の例では、数量指定子が嫉妬しているため、一致は見つかりません。この場合、正規表現 .*+ によって行全体が「食べられ」、「foo」には何も残りません。文字列内の不要なものを破棄する必要がある場合は、嫉妬深い量指定子を使用します。これは、同等の貪欲な量指定子よりも効果的です。それだけです!ソースへのリンク: Java の正規表現の基礎。パート 3
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION