◆正規表現とは? |
正規表現とは文字列のパターンを表現する手法です。英語では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> |
|
おおおお!表示されましたね! |
|
没有评论:
发表评论