Javaで正規表現を使用します


Javaで正規表現


このドキュメントでは、Javaで正規表現を使用する方法について説明します。これは、OracleのWebサイト上のPatternクラスのドキュメントに基づいています。

正規表現とは何ですか?


規則的または正規表現は、文字列のセットを説明する文字列です。


たとえば、正規表現[0-9 * [AZ]は数字と文字で構成されたすべての文字列を記述します。

正規表現とは何ですか?


正規表現は、彼らが達成するために、主に仕える、コンピュータサイエンスの多くの用途があります。
  • フィルター:値=フォーム変数の例の行:テキストファイルの特定の行のみを保持します。
  • コントロール:ユーザーによって指定された入力は、例えば、IPアドレスの形式を有していることを確認します。
  • 置換:正確な文字の文字列でパターンを置き換えます。例えば、小文字に大文字を交換してください。
  • 切欠:例えば、文字列に配置された日付を文字列の一部を回収します。または「へのラインをカット。 「.csvファイルの場合。

正規表現を作成します。


Patternクラス:Javaで正規表現を作成するには、いくつかの構文はOracleのサイト上の公式ドキュメントに記述され、尊敬されています。私は、下記の使用メインキャラクターを説明します。

定期的な用語のコンポーネント

文字


X文字X


文字\\ \


\ Tタブ文字


\ N改行文字


\ rキャリッジリターン文字


フォームフィード文字\ F


例:AB \ AB TCDは、CDSが続くタブに続く文字列を表します。

文字クラス


[Abcの*文字、B、Cの


、BまたはCではない[^ Abcの]文字


[A-Z]文字-Z


[A-Za-z]は文字が小文字または大文字Zに有しています


[0-9]数字


例:[0-9] [ - z]は番号と文字からなる文字列を表します。


文字列「a」または文字列「B」のいずれかを表す[AB *の文字列「AB」を表すABの間に差があることに留意されたいです。

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


        任意の文字


\ D数字:[0-9 *


\ D数字以外の文字:[^ 0-9 *


\白色carctèreS:[\ T \ n \ X0B \ F \ R *


\ S A白以外の文字[^ \ sの*

POSIX文字クラス


\ P {A}下部misnuscule:[-Z *


\ P {アッパー}資本:[A-Z *


\ P {アルファ}アルファベット文字[\ pを{}下部の\ P {上位} *


\ P {}桁数字[0-9 *


\ P {} Alnum英数字文字[\ P {アルファ}の\ P {数字} *


\ P {} PUNCT Ponctionation。"#$%&「()* +、 - /:。;<=>?@ [\ * ^ _「{|}〜


\ P {}空白スペースまたはタブ:[\ T *


\ P {}はXDIGIT進文字[0-9A-FA-F *


\ P {宇宙}白文字[\ Tを\ n \のX0B \ fが\のR *

文字の繰り返し


X? X回またはゼロ回


X X * 0回以上


X + X少なくとも一度(XXの*)


X X {n}はn回


X {n}はX、少なくともn回


X {N、M} X n及びm回

論理演算子


XY XはYに続きます


X | Y XまたはY

IPアドレスと一致する正規表現


IPアドレスは、このようなものです:255.255.0.1または127.0.0.1、形式は次のとおりです。


3桁の点、3桁の点、3桁の点、3桁。


対応する正規表現は次のとおりです。


[0-9 {1,3} * \。[0-9] {1,3} \。[0-9] {1,3} \。[0-9] {1,3}


若しくは


\ D {1,3} \ \ D {1,3} \ \ D {1,3} \ \ D {1,3}


あなたは桁数が1と3の間にあるチェックしたくない場合は、1つは、単純な正規表現を使用することができます。


\ D + \。\ D + \。\ D + \。\ D +


注意:ポイントが書かれている\。 「ので。任意の文字を「「意味文字です」。それ\以前。我々は正規表現としての項目を解釈してはならないことを示すために使用されます。

日付を正規表現マッチング


2012年2月29日の日付が次のパターンに従います。


一つまたは2桁の数字、スペース、任意の数の文字、スペース、その後、4桁の数字。


関連する正規表現は次のとおりです。


[0-9 {1,2} * [-Z] + [0-9] {4}


若しくは


\ D {1,2} \ P {低い}の\ D {4}

dirコマンドの行の正規表現


バック「DIR」コマンドは、ディレクトリ内のファイルが一覧表示されます。次に、このコマンドの出力は次のようになります。


26/01/2012 11時45ファイル


26/01/2012 11時45 file.txtの


形式は次のとおりです。いくつかのスペースが続く時間が続くいくつかのスペースが続く日、、その後、ファイルがディレクトリである場合、文字列と何もないし、最後にファイル名を見つけましたまたはフォルダ。


対応する正規表現です


\ D {1,2} / \ D {1,2} / \ D {1,2}の\ P {スペース} * \ dの{1,2}の\ D {1,2}の\ P {スペース} * \ P {アッパー} * \ pを{スペース} * \ pを{アルファ} *

JAVAを使用して


最初の観察は、\文字は、Javaのための意味を持つということですので、あなたはそれはJavaによって解釈されないように正規表現を書くことで、それを倍にする必要があります。例えば、我々は\\書きます。 \の代わりに。

方法

Stringクラスのmatchesメソッド


パブリックブールマッチ(文字列の正規表現)


正規表現に対して文字列かどうかを知るためにStringクラスのmatchesメソッド。このために、我々は法の正規表現のパラメータを渡し、正規表現は、文字列によって検証されている場合メソッドはtrueを返します。

でReplaceAllメソッド文字列


でReplaceAll公共の文字列(文字列の正規表現、文字列置換)


でReplaceAllメソッドは交換式で、正規表現のすべての出現を置き換えます。 Pattern.compile(正規表現).matcher(STR).ReplaceAll(交換):このメソッドはまたでReplaceAllパターンクラスのメソッドを使用して呼び出すことができます(ここではstrが検索する際に使用する文字列です。

Stringクラスのsplitメソッド


*公共の文字列の分割(文字列の正規表現)


splitメソッドは、正規表現に基づいて文字列をカットすることができます。結果を分割すると、配列で返されます。


切断が(多くの場合、またはスペース「;」)単一の文字を使って行われた場合、我々は代わりに正規表現の使用を許可していませんStringTokenizerはクラスを使用します。

フィルタを作成します


私たちはあなたのホスト名とマシンのIPアドレスとの間のマッピングを含むetc / hostsファイルを読みたい場合は、たとえば、テキストファイルの唯一の特定の行を残しておきたいことがあります。


このファイルには、#文字が先行しているコメントが含まれていてもよいです。あなたは行の最初の文字を回復し、「#」にそれを比較するために十分であると思うだろうが、これはそれほど単純ではありません。


ラインは、最初の非白色の文字が#の場合にだけ、コメントです。正規表現なしで取得するには、それはこのように非常に長いと複雑になり、ネストされたループを持つ関数をコードします。正規表現が使用されている場合にのみ、一行。


私たちは、ArrayListの中にファイルの内容を回復したと仮定し、私たちは、コメントではない行だけを含むリストを取得したいです:


公共の静的な無効メイン(文字列の引数*){


一覧listeInitiale =新しいArrayListを();


listeInitiale.add("## 102.54.94.97 rhino.acme.comソースサーバ");


listeInitiale.add(" #38.78.63.10 x.acme.comクライアントホスト#1のx");


listeInitiale.add("");


listeInitiale.add("#127.0.0.1 localhostを現在のマシン");


{(listeInitialeストリングS)のための


(もし!s.matches("\\ P {宇宙} * [#*。*") && s.length()>0)


System.out.println(S);


}


}

チェックを実行します


フィールドには、IPアドレスに対応することを確認するには、文字列は、前の例のような方法と一致して使用することができます


公共の静的な無効メイン(文字列の引数*){


Stringフィールド= "255.255.10.1";


System.out.println(champ.matches("\\ D \\ {1,3} {1,3} \\ D \\。\\ D \\ {1,3} {1,3} \\ D"));


}

置換を実行します


あなたは、単一のスペースでのファイルのすべての複数のスペースを交換したい場合は、我々は、p {} +スペース\\正規表現でメソッドのrempaceAllを使用することができます



公共の静的な無効メイン(文字列の引数*){


文字列のテスト= "1 2 3 4 5 6 7 8 ";


System.out.println(test.replaceAll("\\ P {} +宇宙"、 " "));


}

チェーンの彫刻を運びます


正規表現に係るチェーンを切断するために、Stringクラスの分割方法を使用します。


例えば、ファイルの各行は以下のような文字の配列によって分離様々な情報で構成されている場合は!@!、テーブルで個別にすべての情報を取得するために、splitメソッドを使用することができます持っています。


例えば:

公共の静的な無効メイン(文字列の引数*){


文字列のテスト= "ジャン・ピエール!@!ポール!@!45";


*文字列情報= test.split("!@!");


System.out.printlnは("名前: "+情報[1 +"\NPrénom: "+インフォ[0])。


}

チェーン内の情報を収集


私たちは、「キャプチャグループ」を使用して文字列にこの情報を復元することができます。


原理は簡単です:1が回復することを希望する正規表現の周りに十分なスペースを括弧します。


たとえば:すべてのプロセス名がマシン上で実行して取得することを希望します。このために我々は次のように私たちのプロセスに関する情報を提供し、コマンドドスTASKLISTを実行します。

utilisationUtilisationのsessionNuméroのimagePIDNomがNameOf
システムアイドルプロセス 0 コンソール 0 28K
システム 4 コンソール 0 44キロバイト
SMSS.EXE 732コンソール 0 60K
Csrss.exe 796 コンソール 0 3564キロバイト
winlogon.exeの 820 コンソール 0 6456キロバイト
SERVICES.EXE 864 コンソール 0 3772キロバイト


私たちは、イメージ名が24文字Ongueよりも長くすることはできませんという事実を利用して情報を取得することができます。しかし、我々は、むしろグループをキャプチャする正規表現を使用します。


この行を記述した正規表現は次のようになります。


[^ 0-9 + \\ P {スペース} + [0-9] +。


私たちは、[0-9 +一部を回復したいので、我々はこの部分の前後に括弧を挿入し、画像の名前を取得するために、Patternクラスのメソッドを使用します。



静的パブリック文字列recupererNomImage(列線){


文字列のres ="";


文字列= patternStr "([^ 0-9 +)\\ P {スペース} + [0-9] +。";


パターンのパターン= Pattern.compile(patternStr)。


マッチャーマッチャー= pattern.matcher(ライン)


ブールmatchFound matcher.find =();


(matchFound場合 && matcher.groupCount()>= 1){


RES = matcher.group(1)。


}


解像度を返します。


}


公共の静的な無効メイン(文字列の引数*){


文字列のテスト="システムアイドルプロセスのコンソール0 0 28キロバイト";


System.out.println(recupererNomImage(テスト))。


}
Javaで正規表現を使用しますこの記事(PDF)をダウンロード cs_Julien39投稿者。 」と題されたこの文書 からのJava»で正規表現を使用しますコード・ソース (Codes-sources.commentcamarche.net)クリエイティブ・コモンズのライセンスの下で利用できるようになります。あなたはライセンスの定める条件の下で、このページのコピーを変更、コピーすることができ、このノートとして明確に表示されます。この記事をダウンロードする(PDF