Javaの正規表現


正規表現は文字列のパターンを定義します。

正規表現はテキストの検索、編集、処理に使用できます。

正規表現は 1 つの言語に限定されるわけではなく、言語ごとに微妙な違いがあります。

Java の正規表現は Perl の正規表現に最も似ています。

java.util.regex パッケージには主に次の 3 つのクラスが含まれています:

  • Pattern クラス:

    pattern オブジェクトは正規表現のコンパイルされた表現です。パターン クラスにはパブリック コンストラクターがありません。 Pattern オブジェクトを作成するには、まずそのパブリック静的コンパイル メソッドを呼び出す必要があります。このメソッドは Pattern オブジェクトを返します。このメソッドは、最初のパラメータとして正規表現を受け入れます。

  • Matcher クラス:

    Matcher オブジェクトは、入力文字列を解釈して照合するエンジンです。 Pattern クラスと同様に、Matcher にはパブリック コンストラクターがありません。 Matcher オブジェクトを取得するには、Pattern オブジェクトの matcher メソッドを呼び出す必要があります。

  • PatternSyntaxException:

    PatternSyntaxException は、正規表現パターンの構文エラーを表す非必須の例外クラスです。


キャプチャグループ

キャプチャグループとは、複数の文字を括弧内でグループ化して作成する方法です。

たとえば、正規表現 (dog) は、「d」、「o」、「g」を含む 1 つのグループを作成します。

キャプチャ グループには、左かっこを左から右に数えることによって番号が付けられます。たとえば、式 ((A)(B(C))) には、そのようなグループが 4 つあります:

  • ((A)(B(C)))

  • (A)

  • (B(C))

  • (C)

matcher オブジェクトの groupCount メソッドを呼び出すことで、式に含まれるグループの数を確認できます。 groupCount メソッドは int 値を返し、マッチャー オブジェクトに現在複数のキャプチャ グループがあることを示します。

常に式全体を表す特別なグループ (グループ 0) もあります。 groupCountの戻り値にはグループは含まれません。

次の例は、指定された文字列から数値文字列を検索する方法を示しています:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    public static void main( String args[] ){

      // 按指定模式在字符串查找
      String line = "This order was placed for QT3000! OK?";
      String pattern = "(.*)(\d+)(.*)";

      // 创建 Pattern 对象
      Pattern r = Pattern.compile(pattern);

      // 现在创建 matcher 对象
      Matcher m = r.matcher(line);
      if (m.find( )) {
         System.out.println("Found value: " + m.group(0) );
         System.out.println("Found value: " + m.group(1) );
         System.out.println("Found value: " + m.group(2) );
      } else {
         System.out.println("NO MATCH");
      }
   }
}

上記の例は、次のように結果をコンパイルして実行します:

Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0

正規表現構文

文字

説明

次の文字を特殊文字、テキスト、後方参照、または 8 進エスケープとしてマークします。たとえば、「n」は文字「n」と一致します。 「n」は改行文字に一致します。シーケンス "\"matches"","("matches"("。

^

は入力文字列の先頭と一致します。RegExpオブジェクトのMultilineプロパティが設定されている場合、^また、「n」または「r」の後の位置と一致します

$

入力文字列の末尾の位置と一致します。 RegExp オブジェクトの Multiline プロパティが設定されている場合、$ は "n" または "r" の前の位置にも一致します。

*

直前の文字または部分式と 0 回以上一致します。たとえば、zo* は「z」と「zoo」に一致します。 * {0,} に相当します。

+

は、先行する文字または部分式と1回以上一致します。たとえば、「zo+」は「zo」と「zoo」に一致しますが、「z」には一致しません。 + {1,} と同等。

?

先行する文字または部分式と 0 回または 1 回一致します。たとえば、「do(es)?」は「do」または「does」の「do」と一致します。 ? {0,1} に相当します。

{n}

n は、負ではない整数です。 n回正確に一致しました。たとえば、「o{2}」は「Bob」の「o」とは一致しませんが、「food」の両方の「o」には一致します。

{n,}

n は、負でない整数です。少なくとも n 回一致しました。たとえば、「o{2,}」は「Bob」の「o」とは一致しませんが、「foooood」のすべての「o」と一致します。 「o{1,}」は「o+」と同等です。 「o{0,}」は「o*」と同等です。

{n,m}

Mnは非負の整数であり、n <= mです。少なくとも n 回、最大 m 回一致しました。たとえば、「o{1,3}」は「fooooood」の最初の 3 つの o と一致します。 「o{0,1}」は「o?」と同等です。注: カンマと数字の間にスペースを挿入することはできません。

?

この文字の後に他の修飾子が続く場合 (*、+、?、{n}、{n,}、{nm})それ以降のマッチングパターンは「非貪欲」です。 「非貪欲」パターンは検索される可能な限り短い文字列に一致しますが、デフォルトの「貪欲」パターンは検索される可能な限り長い文字列に一致します。たとえば、文字列「oooo」では、「o+?」は 1 つの「o」のみに一致しますが、「o+」はすべての「o」に一致します。

.

は、「rn」を除く任意の 1 文字と一致します。 「rn」を含む任意の文字と一致するには、「[sS]」などのパターンを使用します。

(pattern)

patternと一致し、一致した部分式をキャプチャします。キャプチャされた一致は、$0…$9 属性を使用して、結果の「一致」コレクションから取得できます。括弧文字 ( ) と一致させるには、「(」または「)」を使用します。

(?:パターン)

pattern に一致しますが、その一致の部分式をキャプチャしません。つまり、非キャプチャ一致であり、後で使用するために一致を保存しません。これは、パターン部分を「または」文字 (|) と組み合わせるときに便利です。たとえば、「industr(?:y|ies)」は「industry|industries」よりも経済的な表現です。

(?=pattern)

pattern に一致する文字列の先頭にある文字列と一致する前方検索を実行する部分式。これは非キャプチャ一致、つまり、後で使用するためにキャプチャできない一致です。たとえば、「Windows (?=95|98|NT|2000)」は、「Windows 2000」の「Windows」には一致しますが、「Windows 3.1」の「Windows」には一致しません。予測先読みは文字を占有しません。つまり、一致が発生した後、予測先読みを構成する文字の後ではなく、前の一致の直後に次の一致が検索されます。

(?!pattern)

pattern に一致する文字列の先頭にない検索文字列と一致する後方検索を実行する部分式。これは非キャプチャ一致、つまり、後で使用するためにキャプチャできない一致です。たとえば、「Windows (?!95|98|NT|2000)」は、「Windows 3.1」の「Windows」には一致しますが、「Windows 2000」の「Windows」には一致しません。予測先読みは文字を占有しません。つまり、一致が発生した後、予測先読みを構成する文字の後ではなく、前の一致の直後に次の一致が検索されます。

x|y

は、xまたはyと一致します。たとえば、「z|food」は「z」または「food」と一致します。 '(z|f)ood' は、「zood」または「food」と一致します。

[xyz]

文字セット。に含まれる任意の文字と一致します。たとえば、「[abc]」は「plain」の「a」と一致します。

[^xyz]

逆文字セット。含まれていない文字と一致します。たとえば、「[^abc]」は「plain」の「p」、「l」、「i」、および「n」に一致します。

[a-z]

文字範囲。指定された範囲内の任意の文字と一致します。たとえば、「[a-z]」は「a」から「z」の範囲内の任意の小文字と一致します。

[^a-z]

逆範囲文字。指定された範囲内にない任意の文字と一致します。たとえば、「[^a-z]」は「a」から「z」の範囲にない任意の文字に一致します。

b

は、単語の境界、つまり単語とスペースの間の位置に一致します。たとえば、「erb」は「never」の「er」と一致しますが、「verb」の「er」とは一致しません。

B

非単語境界のマッチング。 「erB」は「動詞」の「er」と一致しますが、「never」の「er」とは一致しません。

cx

は、xで示される制御文字と一致します。たとえば、cM は Control-M またはキャリッジ リターンと一致します。 x の値は、A ~ Z または a ~ z の間である必要があります。そうでない場合、c は文字「c」そのものであるとみなされます。

d

数字文字のマッチング。 [0-9]に相当します。

D

数字以外の文字のマッチング。 [^0-9] と同等。

f

フォームブレークマッチング。 x0c および cL に相当します。

n

改行マッチング。 x0a および cJ に相当します。

r

は、復帰文字と一致します。 x0d および cM に相当します。

s

は、スペース、タブ、フォームフィードなどを含む任意の空白文字と一致します。 「fnrtv」に相当。

S

は、空白以外の文字と一致します。 [^ fnrtv] に相当します。

t

タブマッチング。 x09 および cI に相当します。

v

垂直タブのマッチング。 x0b および cK に相当します。

w

は、アンダースコアを含むあらゆるタイプの文字と一致します。 「[A-Za-z0-9_]」に相当します。

W

は、単語以外の文字と一致します。 「[^A-Za-z0-9_]」と同等。

xn

nと一致します。ここで、nは16進数のエスケープコードです。 16 進エスケープ コードの長さは正確に 2 桁である必要があります。たとえば、「x41」は「A」と一致します。 「x041」は「x04」&「1」と同等です。正規表現で ASCII コードを許可します。

num

は、numと一致します。ここで、numは正の整数です。一致をキャプチャするための後方参照。たとえば、「(.)1」は、連続する 2 つの同一の文字と一致します。

n

8 進エスケープ コードまたは後方参照を識別します。 n の前に少なくとも n キャプチャ部分式がある場合、 n は後方参照です。それ以外の場合、n が 8 進数 (0 ~ 7) の場合、n は 8 進数のエスケープ コードになります。

nm

8 進エスケープ コードまたは後方参照を識別します。 nm の前に少なくとも nm キャプチャ部分式がある場合、 nm は後方参照です。 nm の前に少なくとも n キャプチャがある場合、n は後方参照であり、その後に文字 m が続きます。前の条件がどちらも存在しない場合、nm は 8 進数値 nm と一致します。ここで、n m は 8 進数 (0 ~ 7) です。

nml

nが8進数(0〜3)、mlが8進数(0〜7)の場合、8進数のエスケープコードnmlと一致します。

n と一致します。ここで、n は 4 桁の 16 進数で表される Unicode 文字です。たとえば、u00A9 は著作権記号 (©) に一致します。

Matcher クラスのメソッド

Index メソッド

index メソッドは、入力文字列内の一致が見つかった場所を正確に示す便利なインデックス値を提供します:

シリアル番号 方法と説明
1public int start()
前の一致の初期インデックスを返します。
2public int start(intグループ)
前回のマッチング操作中に指定されたグループによってキャプチャされたサブシーケンスの初期インデックスを返します
3public int end()
最後に一致した文字の後のオフセットを返します。
4public int end(intグループ)
前回の照合操作中に指定されたグループによってキャプチャされたサブシーケンスの最後の文字の後のオフセットを返します。

リサーチメソッド

リサーチメソッドは、入力文字列をチェックし、パターンが見つかったかどうかを示すブール値を返すために使用されます:

シリアル番号メソッドと説明
1public boolean lookingAt()
領域の先頭から始まる入力シーケンスをこのパターンに一致させようとします。
2public boolean find()
このパターンに一致する入力シーケンスの次のサブシーケンスを検索してみてください。
3public boolean find(int start)
このマッチャーをリセットし、パターンに一致する、指定されたインデックスから始まる入力シーケンスの次のサブシーケンスの検索を試みます。
4パブリックブール一致()
エリア全体をパターンに合わせてみてください。
Replacement Methods交換方法は、入力文字列のテキストを置き換える方法です。 1

public Matcher appendReplacement(StringBuffer sb, String replace)

非ターミナルの追加および置換手順を実装します。
2public StringBuffer appendTail(StringBuffer sb) 端末の追加・交換手順を実施します。
3public String replaceAll(文字列置換)
指定された置換文字列と一致する入力シーケンスの各サブシーケンスの置換パターン。
4public String replaceFirst(文字列置換)
置換パターンは、入力シーケンスの最初のサブシーケンスを指定された置換文字列と照合します。
5public static String quoteReplacement(String s)
指定された文字列のリテラル置換文字列を返します。このメソッドは、Matcher クラスの appendReplacement メソッドに渡されるリテラル文字列と同様に機能する文字列を返します。

開始メソッドと終了メソッド

以下は、入力文字列に単語「cat」が出現する回数をカウントする例です:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    private static final String REGEX = "\bcat\b";
    private static final String INPUT =
                                    "cat cat cat cattie cat";

    public static void main( String args[] ){
       Pattern p = Pattern.compile(REGEX);
       Matcher m = p.matcher(INPUT); // 获取 matcher 对象
       int count = 0;

       while(m.find()) {
         count++;
         System.out.println("Match number "+count);
         System.out.println("start(): "+m.start());
         System.out.println("end(): "+m.end());
      }
   }
}

上記の例のコンパイルと実行結果は次のとおりです:

Match number 1
start(): 0
end(): 3
Match number 2
start(): 4
end(): 7
Match number 3
start(): 8
end(): 11
Match number 4
start(): 19
end(): 22

この例では、単語境界を使用して、文字「c」「a」「t」が長い単語の単なる部分文字列ではないことを確認します。また、入力文字列内の一致が発生した場所に関するいくつかの有用な情報も提供します。

Start メソッドは、前の一致操作中に指定されたグループによってキャプチャされたサブシーケンスの初期インデックスを返し、end メソッドは最後に一致した文字のインデックスに 1 を追加します。

matches メソッドと LookingAt メソッド

matches メソッドと LookingAt メソッドは両方とも、入力シーケンス パターンの一致を試みるために使用されます。両者の違いは、matcher ではシーケンス全体が一致する必要があるのに対し、lookAt ではその必要がないことです。

これら 2 つのメソッドは、入力文字列の先頭でよく使用されます。

この関数を説明するために次の例を使用します:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    private static final String REGEX = "foo";
    private static final String INPUT = "fooooooooooooooooo";
    private static Pattern pattern;
    private static Matcher matcher;

    public static void main( String args[] ){
       pattern = Pattern.compile(REGEX);
       matcher = pattern.matcher(INPUT);

       System.out.println("Current REGEX is: "+REGEX);
       System.out.println("Current INPUT is: "+INPUT);

       System.out.println("lookingAt(): "+matcher.lookingAt());
       System.out.println("matches(): "+matcher.matches());
   }
}

上記の例のコンパイル結果と実行結果は次のとおりです:

Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
lookingAt(): true
matches(): false

replaceFirst メソッドと replaceAll メソッド

replaceFirst メソッドと replaceAll メソッドは、正規表現に一致するテキストを置換するために使用されます。 。違いは、replaceFirst は最初の一致を置き換えるのに対し、replaceAll はすべての一致を置き換えることです。

次の例は、この関数を説明しています:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
    private static String REGEX = "dog";
    private static String INPUT = "The dog says meow. " +
                                    "All dogs say meow.";
    private static String REPLACE = "cat";

    public static void main(String[] args) {
       Pattern p = Pattern.compile(REGEX);
       // get a matcher object
       Matcher m = p.matcher(INPUT); 
       INPUT = m.replaceAll(REPLACE);
       System.out.println(INPUT);
   }
}

上記の例のコンパイル結果と実行結果は次のとおりです:

The cat says meow. All cats say meow.

appendReplacement メソッドと appendTail メソッド

Matcher クラスは、テキスト置換のための appendReplacement メソッドと appendTail メソッドも提供します:

Look以下の例でこの関数について説明します:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexMatches
{
   private static String REGEX = "a*b";
   private static String INPUT = "aabfooaabfooabfoob";
   private static String REPLACE = "-";
   public static void main(String[] args) {
      Pattern p = Pattern.compile(REGEX);
      // 获取 matcher 对象
      Matcher m = p.matcher(INPUT);
      StringBuffer sb = new StringBuffer();
      while(m.find()){
         m.appendReplacement(sb,REPLACE);
      }
      m.appendTail(sb);
      System.out.println(sb.toString());
   }
}

上記の例のコンパイル結果と実行結果は次のとおりです:

-foo-foo-foo-

PatternSyntaxException クラスのメソッド

PatternSyntaxException は、通常の構文エラーを示す非必須の例外クラスです。表現パターン。

PatternSyntaxException クラスは、どのようなエラーが発生したかを確認するのに役立つ次のメソッドを提供します。

シリアル番号方法と手順
1public String getDescription()
エラーの説明を取得します。
2public int getIndex()
インデックスを間違えます。
3public String getPattern()
間違った正規表現パターンを取得します。
4public String getMessage()
構文エラーとそのインデックスの説明、エラーの正規表現パターン、およびパターン内のエラーのインデックスの視覚的表示を含む複数行の文字列を返します。