| ◆正規表現とは? |
| 正規表現とは文字列のパターンを表現する手法です。英語ではRegular expressionといいます。 |
| ◆正規表現入門 |
| ^ | 行の先頭 |
| $ | 行の末尾 |
| . | 改行以外の任意の1文字 |
| [] | []でくくられた中にある任意の1文字 |
| [^] | []でくくられた中にない任意の1文字 |
| * | 直前の文字の0個以上の並び |
| + | 直前の文字の1個以上の並び |
| ? | 直前の文字が0個または1個 |
| {a} | 直前の文字のa個の並び |
| {a,} | 直前の文字のa個以上の並び |
| {a,b} | 直前の文字のa個以上、b個以下の並び |
| | | 2者択一の演算子 |
|
| |
| ◆正規表現の使用例 |
| ■行の先頭「^」 |
| ^java | 行の先頭がjavaという文字で始まっている場合 |
|
| ■行の末尾「$」 |
| java$ | 行の末尾がjavaという文字で終わっている場合 |
|
| ■改行以外の任意の1文字「.」 |
| java.. | javaの後に改行以外の任意の文字が2つ続く場合 |
|
| ■[]でくくられた中にある任意の1文字「[]」 |
| [a-z] | 小文字のアルファベットの中の1文字 |
| [A-Z] | 大文字のアルファベットの中の1文字 |
| [a-zA-Z] | 小文字または大文字のアルファベットの中の1文字 |
| [0-9] | 数字の中の1文字 |
| [0-9a-z] | 数字または小文字のアルファベットの中の1文字 |
|
| ■[]でくくられた中にない任意の1文字「[^]」 |
| [^a-z] | 小文字のアルファベット以外の1文字 |
| [^A-Z] | 大文字のアルファベット以外の1文字 |
| [^a-zA-Z] | アルファベット以外の1文字 |
| [^0-9] | 数字以外の1文字 |
| [^0-9a-z] | 数字以外、小文字のアルファベット以外の1文字 |
|
| ■直前の文字の0個以上の並び「*」 |
| J* | 0個以上のJの繰り返し |
| .* | 0個以上の任意の文字の繰り返し |
| J.*D | JとDの間に0個以上の任意の文字の繰り返し |
|
| ■直前の文字の1個以上の並び「+」 |
| J+ | 1個以上のJの繰り返し |
| .+ | 1個以上の任意の文字の繰り返し |
| J.+D | JとDの間に1個以上の任意の文字の繰り返し |
|
| ■直前の文字が0個または1個「?」 |
|
| ■直前の文字のa個の並び「{a}」 |
|
| ■直前の文字のa個以上の並び「{a,}」 |
| J{3,} | JJJ,JJJJ,JJJJJ,・・・(3回以上のJの並び) |
|
| ■直前の文字のa個以上、b個以下の並び「{a,b}」 |
| J{3,5} | JJJまたはJJJJまたはJJJJJ |
|
| ■2者択一の演算子「|」 |
| J|A | JまたはA |
| Java|Hello | JavaまたはHello |
|
| |
| ◆ここでの環境 |
| OS | Windows 2000 |
| J2SE | 1.4.0 |
|
|
|
| ◆Java実行環境の構築 |
| アプリケーション編を参考にしてJavaの実行環境を構築してください。 |
| ◆java.util.regexパッケージ |
| 正規表現用クラスはjava.util.regexパッケージに入っています。このパッケージの中にはPatternクラスとMatcherクラス、PatternSyntaxExceptionクラスがあります。 |
| ■Patternクラス |
| 正規表現はコンパイルされてこのクラスのインスタンスになり、Matcherクラスの生成を行います。 |
| ■Matcherクラス |
| Patternクラスから生成される、正規表現のパターンマッチを行うクラスです。 |
| ■PatternSyntaxExceptionクラス |
| 例外クラス。正規表現がコンパイルされるとき、構文が不正な場合にスローされる。 |
| |
| ◆具体的な使い方 |
| ■パターンマッチ |
| ここでは「JavaでHello World」という文字列が「^Java.*」にマッチするか調べています。マッチするので最後のbはtrueになります。 |
Pattern pattern = Pattern.compile("^Java.*");
Matcher matcher = pattern.matcher("JavaでHello World");
boolean b= matcher.matches();
|
|
| ■文字列の分割 |
ここでは「Java Hello World Java,Hello,,World」という文字列をスペースまたはカンマで分割しています。結果は以下のようになります。
Java
Hello
World
Java
Hello
World |
Pattern pattern = Pattern.compile(" [, ]+");
String[] strs = pattern.split("Java Hello World Java,Hello,,World");
for (int i=0;i<strs.length;i++) {
System.out.println(strs[i]);
}
|
|
| ■文字列の置換(最初にマッチしたもののみ) |
ここでは「正規表現でHello World,正規表現でHello World」という文字列の中の最初に出てきた「正規表現」を「Java」で置換しています。結果は以下のようになります。
JavaでHello World,正規表現でHello
World |
pattern = Pattern.compile("正規表現");
matcher = pattern.matcher("正規表現でHello World,正規表現でHello World");
String str = matcher.replaceFirst("Java");
|
|
| ■文字列の置換(一括) |
ここでは「正規表現でHello World,正規表現でHello World」という文字列の中の「正規表現」をすべて「Java」で置換しています。結果は以下のようになります。
JavaでHello World,JavaでHello
World |
pattern = Pattern.compile("正規表現");
matcher = pattern.matcher("正規表現でHello World,正規表現でHello World");
String str = matcher.replaceAll("Java");
|
|
| ■文字列の置換(一つ一つ順々に) |
ここでは「正規表現でHello World,正規表現でHello World」という文字列の中の「正規表現」を「Java」で置換しています。ここでは一つ一つ順々に置換しています。結果は以下のようになります。
JavaでHello World,JavaでHello
World |
Pattern pattern = Pattern.compile("正規表現");
Matcher matcher = pattern.matcher("正規表現でHello World,正規表現でHello World ");
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, "Java");
}
matcher.appendTail(sb);
System.out.println(sb.toString());
|
|
| |
| ◆サンプルコード |
| HelloWorldRegex.java(ここからダウンロード) |
import java.util.regex.*;
public class HelloWorldRegex {
public static void main(String[] args) {
Pattern pattern;
Matcher matcher;
/* パターンマッチ */
System.out.println("<パターンマッチ>");
pattern = Pattern.compile("^Java.*");
matcher = pattern.matcher("JavaでHello World");
boolean b = matcher.matches();
System.out.println(b);
/* 文字列の分割 */
System.out.println("<文字列の分割>");
pattern = Pattern.compile(" ");
String[] strs = pattern.split("Java Hello World");
for (int i=0;i<strs.length;i++) {
System.out.println(strs[i]);
}
/* 文字列の置換(最初にマッチしたもののみ) */
System.out.println("<文字列の置換(最初にマッチしたもののみ)>");
pattern = Pattern.compile("正規表現");
matcher = pattern.matcher("正規表現でHello World,正規表現でHello World");
System.out.println(matcher.replaceFirst("Java"));
/* 文字列の置換(一括) */
System.out.println("<文字列の置換(一括)>");
pattern = Pattern.compile("正規表現");
matcher = pattern.matcher("正規表現でHello World,正規表現でHello World");
System.out.println(matcher.replaceAll("Java"));
/* 文字列の置換(一つ一つ順々に) */
System.out.println("<文字列の置換(一つ一つ順々に)>");
pattern = Pattern.compile("正規表現");
matcher = pattern.matcher("正規表現でHello World,正規表現でHello World");
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, "Java");
}
matcher.appendTail(sb);
System.out.println(sb.toString());
}
}
|
|
|
|
| ◆コンパイルと実行 |
| コマンドプロンプト |
C:\作業フォルダ\regex>javac
HelloWorldRegex.java C:\作業フォルダ\regex>java
HelloWorldRegex
<パターンマッチ>
true
<文字列の分割>
Java
Hello
World
Java
Hello
World
<文字列の置換(最初にマッチしたもののみ)>
JavaでHello World,正規表現でHello World
<文字列の置換(一括)>
JavaでHello World,JavaでHello World
<文字列の置換(一つ一つ順々に)>
JavaでHello World,JavaでHello World C:\作業フォルダ\regex> |
|
| おおおお!表示されましたね! |
| |
没有评论:
发表评论