Latest web development tutorials

Javaの正規表現

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

正規表現は、編集、または処理テキストを検索するために使用することができます。

正規表現は、特定の言語に限定されるものではないが、各言語の微妙な違いがあります。

Java正規表現とPerlは最も類似しています。

java.util.regexパッケージは、次の3つのカテゴリが含まれています。

  • パターンの種類:

    オブジェクトパターンは、正規表現コンパイラで表現したものです。 Patternクラスにはpublicコンストラクタを持っていません。 Patternオブジェクトを作成するには、まずPatternオブジェクトを返し、そのパブリック静的コンパイルメソッドを呼び出す必要があります。 この方法は、最初の引数として正規表現をとります。

  • Matcherのカテゴリ:

    マッチャオブジェクトは、エンジンの入力文字列の解釈と一致する操作です。 Patternクラスと同様に、マッチャは、publicコンストラクタを持ちません。 あなたはMatcherのオブジェクトを取得する方法パターンマッチャーオブジェクトを呼び出す必要があります。

  • PatternSyntaxExceptionの:

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


キャプチャグループ

ときに単一ユニット処理方法のキャプチャグループは、作成する、角カッコで囲み文字を介して、複数の文字です。

たとえば、正規表現(犬)は、単一のグループ、 "D"、 "o"を、そして「G」を含むグループを作成します。

左から右に番号が付けられ、その開き括弧を計算することにより、グループをキャプチャします。 たとえば、式((A)(B(C)))で、4つのこのようなグループがあります。

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

どのように多くのパケット式を参照するにはマッチャーオブジェクト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"は改行文字に一致します。 シーケンス "\\"マッチ "\"、 "\("マッチ "("。

^

入力文字列が始まると一致。 あなたは後に複数行プロパティRegExpオブジェクトのマッチング位置とも^ "の\ n"または"\ r"を設定した場合。

$

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

*

0回以上直前の文字または部分式と一致します。 たとえば、雑* "Z"と "動物園"にマッチします。 * {0、}と同じです。

+

一回以上直前の文字または部分式と一致します。 たとえば、「ZO + "と" zo "および" zoo "マッチが、" Z "は一致しません。 + {1}と同等です。

ゼロまたは1つは、直前の文字または部分式と一致します。 例えば、「(ES)のか?」「やる」か「ない」の「やる」と一致します。 ?{0,1}に相当します。

{N}

nは負でない整数。 ちょうどn回に一致します。 たとえば、「oは{2}」と「O」の「ボブ」は一致しませんが、二つの "o"の試合の "食"。

{N}

nは負でない整数。 マッチ少なくともn回。 例えば、「O {2、}」「O」、およびマッチ「foooood」のすべてのOを「ボブ」と一致していません。 「O {1、} "の" o + "と同等です。 「O {0、}」「Oの* "と同等です。

{N、M}

M及び非負整数n、N<= M。n〜m回で一致。 たとえば、最初の3 O中の "o {1,3}"一致 "fooooood」。 O '{0,1}'と同じであるO '?'。 注:カンマと数字の間にスペースを挿入することはできません。

文字は、他の修飾子に続いた場合(*、+、?、{ N}、{nは、}、{N、M})は、後に、一致パターンは、「非貪欲」です。 「非貪欲」の可能短い文字列を検索するためのパターンマッチング、および可能な長い文字列を検索するには、一致デフォルトの「貪欲」パターン。 たとえば、文字列「OOOO」の「Oの+? "一つだけの" o "と" O + "" o "のすべてに一致すると一致します。

以外の任意の1文字に一致し、 "\ rをする\ n"です。 一致させるには、このような使用パターン "[\ S \ S]」などの文字のいずれかを含む「それぞれ\ r \ n"、が含まれます。

(パターン)

試合のパターンマッチングとキャプチャサブ表現。 あなたが撮影し取得するために0 $ ... $ 9プロパティが"マッチング"コレクションからの結果と一致して使用することができます。 )(括弧文字に一致するように、使用 "\("または "\)。"

(:?パターン)

パターンに一致するが、それは非キャプチャマッチでマッチ部分式をキャプチャしていない、マッチングは、後で使用するために格納されていません。 (|)の組み合わせのモード成分の有用なこれは使用」または「文字のためです。 たとえば、:産業のより経済的な表現| |業界産学(?Y複数可)の比率です」。

(?=パターン)

表現マッチングの開始時点で最初の検索文字列のパターンマッチング文字列が前方予測部分式を行います。 これは、後で使用するために試合を捕捉しない非保存一致です。 たとえば、 'Windowsの(= 95?| 98 | NT | 2000)「マッチング」のWindows 2000」「WindowsのWindowsの「」内の「Windows 3.1」が、は一致しません」。 マッチが発生した後、先読みはすぐに最後のマッチの後ではなく、文字の組成物における最初の予測した後、文字は、検索のための次の一致を取ることはありません。

(?!パターン)

先読みは、逆検索を実行する部分式、式は、検索文字列の出発点で一致する文字列パターンと一致していません。 これは、後で使用するために試合を捕捉しない非保存一致です。 たとえば、 'Windowsの(95 | ?! 98 | NT | 2000)」の「Windows」の「Windows 3.1」に一致しますが、「Windows 2000の "の「Windows」と一致していません。 マッチが発生した後、先読みはすぐに最後のマッチの後ではなく、文字の組成物における最初の予測した後、文字は、検索のための次の一致を取ることはありません。

X|Y

マッチxまたはy。 例えば、「Z |食品」は「Z」や「食」に一致します。 '(Z | f)はOOD「マッチ」zood」や「食」。

[エクシーズ]

文字セット。 任意の文字が含まれる一致します。 たとえば、「[abc]は」「A」の「プレーン」と一致します。

[^エクシーズ]

リバース文字セット。 含まれていない任意の文字に一致します。 たとえば、「[^ abc]は「「私」、「n」は、「L」「P」の「プレーン」と一致します。

[AZ]

文字の範囲。 指定された範囲内の任意の文字に一致します。 たとえば、 "[az]"は、 "Z"の範囲内の任意の小文字に "a"をマッチします。

[^AZ]

文字のリバースレンジ。 ない指定された範囲内の任意の文字と一致します。 たとえば、「[^ AZ]」は「Z」の範囲内の任意の文字に任意のない "a"をマッチします。

\ B

ある単語の境界、単語の位置との間の空間にマッチします。 たとえば、「えー\ bは「「ER」で「決して」と一致しませんが、「ER」の「動詞」に一致していません。

\ B

非ワード境界と一致します。 「ER \ B」は「ER」の「動詞」に一致しますが、「決して」「ER」で一致していません。

\Cのx

マッチ制御文字はxで示されています たとえば、\ CMはコントロール - Mまたはキャリッジリターンと一致します。xの値はAZまたはaからzの間でなければなりません。 そうでない場合、Cが "C"文字そのものであることが想定されます。

\ D

数字に一致します。 [0-9]に相当します。

\ D

数字以外の文字に一致します。 これは[^ 0-9]と等価です。

\ F

フォームフィードマッチ。 \のx0cと\ CLに相当します。

\ N

改行にマッチ。 \のX0Aと\ cJのに相当します。

\ R

キャリッジリターンと一致します。 x0dと\センチ\に相当します。

\ S

等スペース、タブ、改ページ、などの任意の空白文字と一致します [\ F \ nは\ rを\トン\ V]に相当します。

\ S

任意の非空白文字に一致します。 相当する[^ \ F \ nは\ rを\トン\ V]。

\ T

[Match]タブ。 \ x09のと\ cIリ同等と。

\ V

垂直タブ文字と一致します。 \ X0Bと\ CK相当。

\ W

アンダースコアを含む任意の文字クラス文字を、一致します。 そして、「[A-ZA-Z0-9_]「同等。

\ W

任意の非単語文字と一致します。 そして、 "[^ A-ZA-Z0-9_]「同等。

\X nの

マッチのn、nここでは、16進数のエスケープコードです。 進エスケープコードは2桁である必要があり。 たとえば、「\ X41 "一致" A "。 "\ X041"とは "\ X04"& "1"は等価です。 正規表現のASCIIコードの使用を許可します。

\

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

\N

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

\Nmの

8進数のエスケープコードまたは後方参照を識別します。 少なくともnmのキャプチャ部分式の前に\nmのは、その後、後方参照はnmである場合。 少なくともn個のキャプチャ前であれば、\nm、n個の文字メートルに続いて、後方参照です前の2つの例が存在しない場合は、\nおよびmが8進数(0-7)である8進数nmを、一致したNM。

\ NML

nが8進数(0-3)である場合、mおよびlは 、それは、NML進エスケープコードに一致オクタル(0-7)です

\U nを

マッチnは、n4桁の16進数で表されるUnicode文字があります。 例えば\ u00A9は著作権記号(©)と一致します。

Matcherクラスメソッド

インデックス法

インデックスメソッドは、有用な指標値を正確にどこに入力文字列の一致を見つけるために示して提供します。

いいえ。 メソッドと説明
1 公共int型開始()
前回のマッチの最初のインデックスを返します。
2 公共int型開始(int型グループ)
戻る操作でサブシーケンス初期のインデックスの指定されたグループによって先方前回のマッチ、中
3 公共int型エンド()
最後にマッチした文字の後のオフセットを返します。
4 公共int型エンド(int型のグループ)
バック操作の前の試合中に、キャプチャのシーケンスの後の文字の最後のグループからのオフセットを指定することによって。

研究方法

方法は、入力文字列を確認するために使用され、パターンが見つかったかどうかを示すブール値を返します。

いいえ。 メソッドと説明
1 パブリックブールlookingAt()
入力シーケンスの先頭の先頭から面積がパターンにマッチしてみてください。
2 パブリックブールのfind()
次のシーケンスのパターンに一致する入力列を検索してみてください。
3 パブリックブール検索(int型開始)
この正規表現エンジンをリセットし、パターンに一致するものを見つけ、指定したインデックスから開始し、次のサブシーケンスを入力しようとします。
4 パブリックブールマッチ()
地域全体とパターンマッチングを試してみてください。

交換方法

代替テキストの入力方法で文字列を置換することです。

いいえ。 メソッドと説明
1 公共マッチャappendReplacement(StringBufferのSB、文字列置換)
非末端付加および置換ステップを達成するために。
2 公共のStringBuffer appendTail(StringBufferのSB)
ターミナル付加および置換ステップを達成。
3 公共の文字列でReplaceAll(文字列置換)
各シーケンスの入力シーケンスと一致するように指定した置換文字列に置換モード。
4 パブリック文字列replaceFirstという(文字列置換)
最初のサブシーケンスの入力シーケンスに一致する指定された置換文字列に置換モード。
5 パブリック静的文字列quoteReplacement(のString)
文字列リテラル置換文字列を返します。 このメソッドは、文字列リテラルとしてappendReplacementのMatcherクラスの仕事への方法として渡される文字列を返します。

開始と終了方法

ここで、「猫」が表示された単語をカウントするための入力文字列内の出現回数の例は次のとおりです。

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" "" "T"は単にロングワードストリングではないことを保証するために、例えば、ワード境界を使用して見ることができます。 また、位置を一致させ、入力文字列に関するいくつかの有用な情報を提供しています。

Startメソッドは、初期のインデックス指定されたグループ捕獲さサブシーケンスから、最後のインデックスプラス1文字にマッチする方法を終了、前回のマッチ時の動作を返します。

マッチとlookingAt方法

マッチとlookingAt方法は、入力パターンのシーケンスに一致するように試みるために使用されます。 彼らは、シーケンス全体マッチャの試合の要件とは異なりますが、必須ではありませんlookingAt。

入力文字列が始まる、これらの二つの方法がしばしば使用されます。

次の例を通して、この機能を説明します:

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メソッドは、正規表現と一致するテキストを置き換えるために使用しました。 違いはでReplaceAllは、すべての一致を置き換え、replaceFirstという最初の試合を交換、です。

この機能を説明するために、次の例:

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のクラスでは、appendTail appendReplacementするための方法を提供し、テキストを置き換えます:

この機能を説明するために、次の例を見てみましょう。

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のクラスは、私たちは、エラーが発生したかを確認するために、次のメソッドを提供します。

いいえ。 メソッドと説明
1 公共の文字列のgetDescription()
エラーの説明を取得します。
2 公共のint getIndex()
間違ったインデックスを取得します。
3 パブリック文字列getPattern()
エラーが発生した正規表現パターンを取得します。
4 公共の文字列のgetMessage()
構文エラーの説明とそのインデックス、エラーが発生した正規表現パターンの視覚的な表示、およびエラーインデックスを含む複数行の文字列を返します。