Java-正規表現
Java には、正規表現によるパターン マッチング用の java.util.regex パッケージが用意されています。 Java の正規表現は Perl プログラミング言語に非常に似ており、習得が非常に簡単です。
正規表現は、パターンに保持された特殊な構文を使用して、他の文字列または文字列のセットを照合または検索するのに役立つ特別な文字列です。テキストやデータの検索、編集、または操作に使用できます。
java.util.regex パッケージは、主に次の 3 つのクラスで構成されます −
- <リ>
パターン クラス − パターン オブジェクトは、正規表現のコンパイル済み表現です。 Pattern クラスは、パブリック コンストラクターを提供しません。パターンを作成するには、最初に public static compile() のいずれかを呼び出す必要があります これらのメソッドは Pattern オブジェクトを返します。これらのメソッドは、最初の引数として正規表現を受け入れます。
<リ>Matcher クラス − Matcher オブジェクトは、パターンを解釈し、入力文字列に対して一致操作を実行するエンジンです。 Pattern クラスと同様に、Matcher はパブリック コンストラクターを定義しません。 matcher() を呼び出して、Matcher オブジェクトを取得します。 パターン オブジェクトのメソッド。
<リ>PatternSyntaxException − PatternSyntaxException オブジェクトは、正規表現パターンの構文エラーを示す未チェックの例外です。
グループのキャプチャ
グループのキャプチャは、複数のキャラクターを 1 つのユニットとして扱う方法です。これらは、グループ化する文字を一連の括弧内に配置することによって作成されます。たとえば、正規表現 (dog) は、文字「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 to be scanned to find the pattern. String line = "This order was placed for QT3000! OK?"; String pattern = "(.*)(\\d+)(.*)"; // Create a Pattern object Pattern r = Pattern.compile(pattern); // Now create matcher object. 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
正規表現の構文
以下は、Java で使用可能なすべての正規表現のメタ文字構文をリストした表です −
部分式 | 一致 |
---|---|
^ | 行頭に一致します。 |
$ | 行末に一致します。 |
. | 改行を除く任意の 1 文字に一致します。 m の使用 オプションを使用すると、改行にも一致させることができます。 |
[...] | 括弧内の任意の 1 文字に一致します。 |
[^...] | 角かっこで囲まれていない任意の 1 文字に一致します。 |
\A | 文字列全体の先頭 |
\z | 文字列全体の終わり。 |
\Z | 許容される最終行ターミネータを除く、文字列全体の終わり。 |
re* | 前の式の 0 回以上の出現に一致します。 |
re+ | 前のものの 1 つ以上に一致します。 |
re? | 前の式の 0 回または 1 回の出現に一致します。 |
re{ n} | 前の式の n 回の出現に正確に一致します。 |
re{ n,} | 前の式の n 回以上の出現に一致します。 |
re{ n, m} | 前の式の n 回以上 m 回以下の出現に一致します。 |
a| b | a または b のいずれかと一致します。 |
(re) | 正規表現をグループ化し、一致したテキストを記憶します。 |
(?:re) | 一致したテキストを記憶せずに正規表現をグループ化します。 |
(?> re) | 後戻りせずに独立したパターンに一致します。 |
\w | 単語の文字に一致します。 |
\W | 非単語文字に一致します。 |
\s | 空白に一致します。 [\t\n\r\f] と同等。 |
\S | 非空白に一致します。 |
\d | 数字を一致させます。 [0-9] に相当。 |
\D | 非数字に一致します。 |
\A | 文字列の先頭に一致します。 |
\Z | 文字列の末尾に一致します。改行が存在する場合、改行の直前に一致します。 |
\z | 文字列の末尾に一致します。 |
\G | 最後の試合が終了した時点に一致します。 |
\n | キャプチャ グループ番号 "n" への後方参照。 |
\b | 角かっこの外側にある単語の境界に一致します。括弧内ではバックスペース (0x08) と一致します。 |
\B | 非単語境界に一致します。 |
\n、\t など | 改行、改行、タブなどに一致 |
\Q | \E までのすべての文字をエスケープ (引用符) します。 |
\E | \Q で始まる引用を終了します。 |
Matcher クラスのメソッド
これは便利なインスタンスメソッドのリストです −
インデックス メソッド
インデックス メソッドは、入力文字列で一致が見つかった場所を正確に示す便利なインデックス値を提供します −
Sr.No. | 方法と説明 |
---|---|
1 | public int start() 前の一致の開始インデックスを返します。 |
2 | public int start(int グループ) 前回の一致操作中に特定のグループによってキャプチャされたサブシーケンスの開始インデックスを返します。 |
3 | public int end() 最後に一致した文字の後のオフセットを返します。 |
4 | public int end(int グループ) 前回の一致操作中に特定のグループによってキャプチャされたサブシーケンスの最後の文字の後のオフセットを返します。 |
研究方法
スタディ メソッドは入力文字列を確認し、パターンが見つかったかどうかを示すブール値を返します −
Sr.No. | 方法と説明 |
---|---|
1 | public boolean lookingAt() 領域の先頭から始まる入力シーケンスをパターンと照合しようとします。 |
2 | パブリック ブール検索() パターンに一致する入力シーケンスの次のサブシーケンスを見つけようとします。 |
3 | public boolean find(int start) このマッチャーをリセットし、指定されたインデックスから開始して、パターンに一致する入力シーケンスの次のサブシーケンスを見つけようとします。 |
4 | 公開ブールマッチ() 領域全体をパターンと一致させようとします。 |
交換方法
置換メソッドは、入力文字列内のテキストを置換するための便利なメソッドです −
Sr.No. | 方法と説明 |
---|---|
1 | public Matcher appendReplacement(StringBuffer sb, String replacement) 非終端追加および置換ステップを実装します。 |
2 | public StringBuffer appendTail(StringBuffer sb) 端末の追加と置換のステップを実装します。 |
3 | public String replaceAll(文字列置換) パターンに一致する入力シーケンスのすべてのサブシーケンスを、指定された置換文字列に置き換えます。 |
4 | public String replaceFirst(文字列置換) パターンに一致する入力シーケンスの最初のサブシーケンスを、指定された置換文字列に置き換えます。 |
5 | public static String quoteReplacement(String s) 指定された文字列のリテラル置換文字列を返します。このメソッドは、リテラル置換 s として機能する文字列を生成します Matcher クラスの appendReplacement メソッド内。 |
start メソッドと end メソッド
以下は、単語「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); // get a matcher object 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 メソッドはどちらも、入力シーケンスをパターンと照合しようとします。ただし、違いは、マッチングでは入力シーケンス全体が一致する必要があるのに対し、lookAt では一致しないことです。
どちらの方法も、常に入力文字列の先頭から開始します。機能を説明する例を次に示します-
例
ライブデモ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 メソッドも提供します。
機能を説明する例を次に示します-
例
ライブデモ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); // get a matcher object 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 クラスは、何が問題なのかを判断するのに役立つ次のメソッドを提供します −
Sr.No. | 方法と説明 |
---|---|
1 | public String getDescription() エラーの説明を取得します。 |
2 | public int getIndex() エラー インデックスを取得します。 |
3 | public String getPattern() 誤った正規表現パターンを取得します。 |
4 | public String getMessage() 構文エラーの説明とそのインデックス、エラーのある正規表現パターン、およびパターン内のエラー インデックスの視覚的表示を含む複数行の文字列を返します。 |
Java