Java - 正規表現

ようこそ、Javaプログラマー志願者の皆さん!今日は、Javaの正規表現(Regex)の素晴らしい世界に飛び込んでいきます。プログラミングに初めての方でも心配いりません。私はこの旅をステップバイステップにガイドしてくれます。これまでの教えの中で無数の学生たちにも同じように導いたことがありますから。だから、コーヒーを片手に、一緒にこの素晴らしい冒険に出発しましょう!

Java - Regular Expressions

正規表現とは?

Java固有の実装に飛び込む前に、正規表現とは何か理解しましょう。テキストの海の中から特定のパターンを見つける探偵のように考えてみてください。それがまさにRegexが行うことです。それは、文字列のパターンマッチングと操作に非常に強力なツールです。

Javaの正規表現(Regex)クラス

Javaはjava.util.regexというパッケージを提供しており、正規表現を扱うためのいくつかのクラスが含まれています。私たちが焦点を当てる3つの主要クラスは以下の通りです:

  1. Pattern
  2. Matcher
  3. PatternSyntaxException

それぞれのクラスを詳しく説明しましょう。

Patternクラス

Patternクラスは、正規表現のコンパイル済み表現を示します。それは、パターンマッチングの探偵作業の青本と考えてください。

import java.util.regex.Pattern;

public class PatternExample {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("Hello");
System.out.println("Pattern created: " + pattern);
}
}

この例では、単純なパターンとして「Hello」と一致する単語を作成しています。compile()メソッドは正規表現を文字列として取り込み、Patternオブジェクトを返します。

Matcherクラス

Matcherクラスは、実際に魔法が起こる場所です。それは、Patternに基づいて文字列のシーケンスに対してマッチ操作を行います。

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

public class MatcherExample {
public static void main(String[] args) {
String text = "Hello, World! Hello, Java!";
Pattern pattern = Pattern.compile("Hello");
Matcher matcher = pattern.matcher(text);

while (matcher.find()) {
System.out.println("Found match at index: " + matcher.start());
}
}
}

このコードは、指定されたテキストの中でパターン「Hello」を検索し、各一致の開始インデックスを印刷します。それは、探偵がドキュメントの中ですべての手がかりを見つけるのに似ています!

正規表現の構文

次に、より複雑なパターンを作成するための基本的な構文を学びましょう。以下は、一般的に使用されるメタ文字の一覧です:

メタ文字 説明
. 任意の一文字
^ 行の先頭
$ 行の末尾
* 0回以上の出現
+ 1回以上の出現
? 0回か1回の出現
\d 数字
\s 空白文字
\w 単語文字(アルファベット、数字、アンダースコア)

いくつかのこれらを動作に見てみましょう:

public class RegexSyntaxExample {
public static void main(String[] args) {
String text = "The quick brown fox jumps over the lazy dog";

// 'q'で始まる単語をマッチ
Pattern pattern1 = Pattern.compile("\\bq\\w+");
Matcher matcher1 = pattern1.matcher(text);
if (matcher1.find()) {
System.out.println("'q'で始まる単語: " + matcher1.group());
}

// 'g'で終わる単語をマッチ
Pattern pattern2 = Pattern.compile("\\w+g\\b");
Matcher matcher2 = pattern2.matcher(text);
if (matcher2.find()) {
System.out.println("'g'で終わる単語: " + matcher2.group());
}
}
}

この例では、\bを単語境界として使用し、\w+を1つ以上の単語文字として使用し、それらを'q'と'g'と組み合わせて、それぞれ'q'で始まる単語と'g'で終わる単語を見つけています。

正規表現のキャプチャグループ

キャプチャグループを使用すると、複数の文字を一つの単位として扱うことができます。これらは、括弧内にグループ化された文字を配置することで作成されます。

public class CapturingGroupExample {
public static void main(String[] args) {
String text = "John Doe ([email protected])";
Pattern pattern = Pattern.compile("(\\w+)\\s(\\w+)\\s\\((\\w+@\\w+\\.\\w+)\\)");
Matcher matcher = pattern.matcher(text);

if (matcher.find()) {
System.out.println("First Name: " + matcher.group(1));
System.out.println("Last Name: " + matcher.group(2));
System.out.println("Email: " + matcher.group(3));
}
}
}

この例では、人の名前とメールアドレスを文字列から抽出しています。パターン内の括弧はキャプチャグループを作成し、matcher.group(n)を使用してアクセスできます。

正規表現 - Matcherクラスのメソッド

Matcherクラスはいくつかの便利なメソッドを提供しています。以下は、最も一般的に使用されるものの一部です:

メソッド 説明
find() パターンに一致する次のマッチを見つける
group() 一致した部分文字列を返す
start() マッチの開始インデックスを返す
end() マッチの終了インデックスを返す
matches() 文字列全体がパターンと一致するかどうかを確認

これらのメソッドを動作に見てみましょう:

public class MatcherMethodsExample {
public static void main(String[] args) {
String text = "The rain in Spain falls mainly on the plain";
Pattern pattern = Pattern.compile("\\b\\w+ain\\b");
Matcher matcher = pattern.matcher(text);

while (matcher.find()) {
System.out.println("Found: " + matcher.group());
System.out.println("Start index: " + matcher.start());
System.out.println("End index: " + matcher.end());
}
}
}

このコードは、末尾が「ain」の単語を見つけて、各一致の開始インデックスと終了インデックスを印刷します。

正規表現 - 置換メソッド

正規表現は、パターンを見つけるだけでなく、テキストを置換するのにも素晴らしいです。Matcherクラスはこれを目的とするメソッドを提供しています:

public class ReplacementExample {
public static void main(String[] args) {
String text = "The quick brown fox jumps over the lazy dog";
Pattern pattern = Pattern.compile("fox|dog");
Matcher matcher = pattern.matcher(text);

String result = matcher.replaceAll("animal");
System.out.println("After replacement: " + result);
}
}

この例では、「fox」と「dog」を「animal」に置換しています。replaceAll()メソッドがすべての作業を行ってくれます!

正規表現 - PatternSyntaxExceptionクラス

時々、正規表現を書いている際に間違いを犯すこともあります。そんなときに便利なのがPatternSyntaxExceptionクラスです。それは、正規表現パターンに構文エラーがあることを示すために投げられます。

public class PatternSyntaxExceptionExample {
public static void main(String[] args) {
try {
Pattern.compile("[");  // 無効な正規表現
} catch (PatternSyntaxException e) {
System.out.println("Pattern syntax exception: " + e.getMessage());
System.out.println("Index of error: " + e.getIndex());
}
}
}

このコードは、意図的に無効な正規表現を使用して、PatternSyntaxExceptionがどのように動作するかを示しています。それは、正規表現にビルトインの校正者があるかのようです!

それでは、皆さん!私たちはJavaの正規表現の土地を旅をしました。基本的なパターンから複雑な置換まで。覚えておきましょう、強力なツールとして、どれだけ練習すればするほど有用になります。だから、怕れずに自分のパターンを作成し、実験してみてください。もしかしたら、パターンマッチングのシェルドック・ホームズになるかもしれません!

コーディングお楽しみで、あなたの文字列が常に期待したものと一致することを願っています!

Credits: Image by storyset