正規表現とは
生徒
教授?
正規表現って何ですか?
教授
正規表現とは、文字列のパターンを一つの形式でまとめて表現するために使うものです。
Javaでは、java.util.regexパッケージに正規表現を扱うためのクラスが用意されていますよ?
記号 | 意味 |
---|---|
. | 任意の一文字 |
* | 直前の文字の0回以上の繰り返し |
+ | 直前の文字の1回以上の繰り返し |
? | 直前の文字の0回か1回 |
[XYZ] | XYZいずれか一文字 |
[^XYZ] | XYZ以外の一文字 |
[X-Z] | XからZまでの範囲で一文字 |
Javaの正規表現
生徒
実際のJavaのコードはどんな感じですか?
教授
まずPatternクラスでパターンをコンパイルし、次にMatcherクラスで文字列とマッチさせます。
例えば、次のコードは「a*b」というパターンに「aaaaab」という文字列がマッチするかどうかを判定します。
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class RegexExample {
public static void main(String[] args) {
Pattern p = Pattern.compile("a*b"); // パターンをコンパイル
Matcher m = p.matcher("aaaaab"); // 文字列とマッチさせる
boolean b = m.matches(); // マッチしたかどうかをbooleanで返す
System.out.println(b); // true
}
}
生徒
*(アスタリスク)が直前の文字「a」の0回以上の繰り返しという意味なのですね。
教授
そんな感じです。
正規表現のメタキャラクタ
教授
正規表現について、他にも例を挙げてみましょう。
//電話番号の形式(例:03-1234-5678)にマッチする正規表現
Pattern p = Pattern.compile("\\d{2,4}-\\d{2,4}-\\d{4}");
//メールアドレスの形式(例:test@example.com)にマッチする正規表現
Pattern p = Pattern.compile("[\\w\\.\\-]+@[\\w\\.\\-]+\\.[A-Za-z]+");
//HTMLタグ(例:<p>)にマッチする正規表現
Pattern p = Pattern.compile("<[^>]+>");
生徒
また、よくわからない記号が出てきましたね。
教授
メタキャラクタというものになりますよ?
記号 | 意味 |
---|---|
\d | 数字 |
\w | 英数字 |
\s | 空白文字 |
. | ピリオドそのもの |
+ | 直前の文字の1回以上の繰り返し |
* | 直前の文字の0回以上の繰り返し |
? | 直前の文字の0回か1回 |
{n} | 直前の文字のn回 |
{n,m} | 直前の文字のn回からm回まで |
[ ] | 括弧内のいずれか一文字 |
[^ ] | 括弧内以外の一文字 |
^ | 行頭 |
$ | 行末 |
教授
正規表現は、文字列を検索したり置換したりするときに便利です。
Javaでは、Matcherクラスに検索や置換に関するメソッドが用意されています。
例えば、次のコードは「a*b」というパターンにマッチする部分を「X」に置換しますよ?
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class RegexExample {
public static void main(String[] args) {
Pattern p = Pattern.compile("a*b"); // パターンをコンパイル
Matcher m = p.matcher("aabaaab"); // 文字列とマッチさせる
String s = m.replaceAll("X"); // マッチした部分をXに置換
System.out.println(s); // XaX
}
}
生徒
へぇー。
なんとなく分かりました。
教授
なるほど。
君の正規表現にはマッチしなかったようですね?