2000年3月29日星期三

正規表現編

◆正規表現とは?
正規表現とは文字列のパターンを表現する手法です。英語では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個「?」
JA? JまたはJA
■直前の文字のa個の並び「{a}」
J{2} JJ
J{3} JJJ
■直前の文字の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>

おおおお!表示されましたね!
 

没有评论:

发表评论