正規表現は、Javaで利用できるものです。Javaの正規表現の例です。
Javaの正規表現へようこそ。Javaではこれは正規表現とも呼ばれます。プログラミングを始めた時、Javaの正規表現は私にとって悪夢でした。このチュートリアルは、Javaの正規表現をマスターするのを助けることを目的としています。また、私もここに戻ってJavaの正規表現の学習を振り返ります。
Javaにおける正規表現
Javaの正規表現は、文字列のパターンを定義します。正規表現は、テキストの検索、編集、操作に使用することができます。正規表現は、言語によって異なりますが、Javaの正規表現はPerlに最も類似しています。Javaの正規表現クラスは、java.util.regexパッケージに存在し、3つのクラスが含まれています。
-
- パターン:パターンオブジェクトは、正規表現のコンパイルされたバージョンです。 パターンクラスには公開されたコンストラクタはなく、正規表現の引数を渡してパターンオブジェクトを作成するために、その公開されたstaticメソッドである”compile”を使用します。
マッチャー:マッチャーは、入力文字列のパターンと作成されたパターンオブジェクトをマッチングするJavaの正規表現エンジンオブジェクトです。 マッチャークラスには公開されたコンストラクタはなく、パターンオブジェクトのマッチャーメソッドを使用して入力文字列を引数にしてマッチャーオブジェクトを取得します。 その後、regexパターンと入力Stringが一致するかどうかに基づいて真偽値の結果を返す”matches”メソッドを使用します。
PatternSyntaxException:正規表現の構文が正しくない場合、PatternSyntaxExceptionがスローされます。
「Javaの正規表現の例題プログラムを見てみましょう。」
package com.scdev.util;
import java.util.regex.*;
public class PatternExample {
public static void main(String[] args) {
Pattern pattern = Pattern.compile(".xx.");
Matcher matcher = pattern.matcher("MxxY");
System.out.println("Input String matches regex - "+matcher.matches());
// bad regular expression
pattern = Pattern.compile("*xx*");
}
}
このJavaの正規表現の例のプログラムを実行すると、以下の出力が得られます。
Input String matches regex - true
Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0
*xx*
^
at java.util.regex.Pattern.error(Pattern.java:1924)
at java.util.regex.Pattern.sequence(Pattern.java:2090)
at java.util.regex.Pattern.expr(Pattern.java:1964)
at java.util.regex.Pattern.compile(Pattern.java:1665)
at java.util.regex.Pattern.(Pattern.java:1337)
at java.util.regex.Pattern.compile(Pattern.java:1022)
at com.scdev.util.PatternExample.main(PatternExample.java:13)
Javaの正規表現はStringを中心に回っており、Java 1.4ではStringクラスが拡張され、regexパターンのマッチングを行うmatchesメソッドが提供されています。内部的にはPatternクラスとMatcherクラスが使われて処理が行われますが、明らかにコード行数を減らすことができます。Patternクラスには、regexと入力のStringを引数として受け取り、それらをマッチングした後にブール値の結果を返すmatchesメソッドも含まれています。したがって、以下のコードはJavaで正規表現と入力のStringをマッチングするのに問題ありません。
String str = "bbb";
System.out.println("Using String matches method: "+str.matches(".bb"));
System.out.println("Using Pattern matches method: "+Pattern.matches(".bb", str));
もし入力文字列をパターンと一致させるだけであれば、単純な文字列の一致メソッドを使用することで時間とコードの行数を節約できます。入力文字列を操作する必要がある場合やパターンを再利用する必要がある場合にのみ、PatternクラスとMatchesクラスを使用するべきです。正規表現によって定義されたパターンは、左から右に文字列に適用されます。一度ソースの文字がマッチングに使用されると、再利用することはできません。例えば、正規表現”121″は、”_121____121″としてのみ「31212142121」に2回一致します。
Javaにおける正規表現 – 一般的なマッチングシンボル
Regular Expression | Description | Example |
---|---|---|
. | Matches any single character | (“…”, “a%”) – true(“…”, “.a”) – true (“…”, “a”) – false |
^aaa | Matches aaa regex at the beginning of the line | (“^a.c.”, “abcd”) – true (“^a”, “ac”) – false |
aaa$ | Matches regex aaa at the end of the line | (“…cd$”, “abcd”) – true(“a$”, “a”) – true (“a$”, “aca”) – false |
[abc] | Can match any of the letter a, b or c. [] are known as character classes. | (“^[abc]d.”, “ad9”) – true(“[ab].d$”, “bad”) – true (“[ab]x”, “cx”) – false |
[abc][12] | Can match a, b or c followed by 1 or 2 | (“[ab][12].”, “a2#”) – true(“[ab]…[12]”, “acd2”) – true (“[ab][12]”, “c2”) – false |
[^abc] | When ^ is the first character in [], it negates the pattern, matches anything except a, b or c | (“[^ab][^12].”, “c3#”) – true(“[^ab]…[^12]”, “xcd3”) – true (“[^ab][^12]”, “c2”) – false |
[a-e1-8] | Matches ranges between a to e or 1 to 8 | (“[a-e1-3].”, “d#”) – true(“[a-e1-3]”, “2”) – true (“[a-e1-3]”, “f2”) – false |
xx | yy | Matches regex xx or yy |
Javaの正規表現メタキャラクター
Javaの正規表現にはいくつかのメタ文字があります。これは、一般的な一致パターンのためのショートコードのようなものです。
Regular Expression | Description |
---|---|
\d | Any digits, short of [0-9] |
\D | Any non-digit, short for [^0-9] |
\s | Any whitespace character, short for [\t\n\x0B\f\r] |
\S | Any non-whitespace character, short for [^\s] |
\w | Any word character, short for [a-zA-Z_0-9] |
\W | Any non-word character, short for [^\w] |
\b | A word boundary |
\B | A non word boundary |
正規表現でメタ文字を通常の文字として使用する方法は2つあります。
-
- 「メタキャラクターの前にバックスラッシュ(\)を置いてください。
- メタキャラクターを\Q(引用を開始する)と\E(引用を終了する)の間に保持してください。」
Javaにおける正規表現 – 量指定子
Javaの正規表現クォンタイファイアは、一致する文字の出現回数を指定します。
Regular Expression | Description |
---|---|
x? | x occurs once or not at all |
X* | X occurs zero or more times |
X+ | X occurs one or more times |
X{n} | X occurs exactly n times |
X{n,} | X occurs n or more times |
X{n,m} | X occurs at least n times but not more than m times |
Javaの正規表現の量指定子は、文字クラスやキャプチャグループとも使用することができます。例えば、[abc]+は、a、b、またはcを1回以上繰り返すことを意味します。 (abc)+は、「abc」というグループを1回以上繰り返すことを意味します。次に、キャプチャグループについて説明します。
Javaにおける正規表現 – キャプチャグループ
Javaの正規表現で、キャプチャグループは複数の文字を単一の単位として扱うために使用されます。()を使用してグループを作成することができます。キャプチャグループに一致する入力文字列の部分はメモリに保存され、バックリファレンスを使用して再呼び出すことができます。matcher.groupCountメソッドを使用すると、Javaの正規表現パターンでのキャプチャグループの数を調べることができます。例えば、((a)(bc))には3つのキャプチャグループが含まれています- ((a)(bc))、(a)、(bc)。バックリファレンスは、バックスラッシュ(\)とグループの番号を指定して、正規表現内で使用することができます。キャプチャグループとバックリファレンスは混乱する場合があるので、例を使って理解しましょう。
System.out.println(Pattern.matches("(\\w\\d)\\1", "a2a2")); //true
System.out.println(Pattern.matches("(\\w\\d)\\1", "a2b2")); //false
System.out.println(Pattern.matches("(AB)(B\\d)\\2\\1", "ABB2B2AB")); //true
System.out.println(Pattern.matches("(AB)(B\\d)\\2\\1", "ABB2B3AB")); //false
最初の例では、ランタイムで最初のキャプチャグループは(\w\d)であり、”a2a2″というインプット文字列とマッチすると、”a2″という値がメモリに保存されます。そのため、\1は”a2″を指しており、したがって真を返します。同じ理由で、2番目の文は偽を出力します。3番目と4番目の文については、このシナリオを自分で理解してみてください。:) では、PatternクラスとMatcherクラスのいくつかの重要なメソッドについて見ていきましょう。
-
- 私たちはフラグを使用してPatternオブジェクトを作成することができます。たとえば、Pattern.CASE_INSENSITIVEは大文字と小文字を区別せずにマッチングを行います。
-
- Patternクラスはまた、Stringクラスのsplit()メソッドに似たsplit(String)メソッドも提供しています。
-
- PatternクラスのtoString()メソッドは、このパターンがコンパイルされた正規表現の文字列を返します。
-
- Matcherクラスにはstart()メソッドとend()メソッドのインデックスメソッドもあり、マッチングが入力文字列内のどこで見つかったかを正確に示します。
- Matcherクラスはまた、文字列の置換に使用するreplaceAll(String replacement)メソッドとreplaceFirst(String replacement)メソッドも提供しています。
シンプルな例プログラムで、これらのJavaの正規表現メソッドを見てみましょう。
package com.scdev.util;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExamples {
public static void main(String[] args) {
// using pattern with flags
Pattern pattern = Pattern.compile("ab", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher("ABcabdAb");
// using Matcher find(), group(), start() and end() methods
while (matcher.find()) {
System.out.println("Found the text \"" + matcher.group()
+ "\" starting at " + matcher.start()
+ " index and ending at index " + matcher.end());
}
// using Pattern split() method
pattern = Pattern.compile("\\W");
String[] words = pattern.split("one@two#three:four$five");
for (String s : words) {
System.out.println("Split using Pattern.split(): " + s);
}
// using Matcher.replaceFirst() and replaceAll() methods
pattern = Pattern.compile("1*2");
matcher = pattern.matcher("11234512678");
System.out.println("Using replaceAll: " + matcher.replaceAll("_"));
System.out.println("Using replaceFirst: " + matcher.replaceFirst("_"));
}
}
上記のJava正規表現の例プログラムの出力は次のとおりです。
Found the text "AB" starting at 0 index and ending at index 2
Found the text "ab" starting at 3 index and ending at index 5
Found the text "Ab" starting at 6 index and ending at index 8
Split using Pattern.split(): one
Split using Pattern.split(): two
Split using Pattern.split(): three
Split using Pattern.split(): four
Split using Pattern.split(): five
Using replaceAll: _345_678
Using replaceFirst: _34512678
Javaにおける正規表現については以上です。最初はJavaの正規表現は難しく感じるかもしれませんが、しばらく使ってみると簡単に学び、使いこなせるようになります。
私たちのGitHubリポジトリから、完全なコードと正規表現の例をさらにチェックアウトすることができます。