J2SE1.4の新機能にさわる

作成 2002/10/22
更新 2002/10/23

今更ですが、J2SE1.4の新機能を簡単に調査したいと思います。 何だかいっぱいあるので、目につくものだけ、 簡単にさらーといってみたいと思います。

ひととおりのことは、J2SE1.4のドキュメントの新機能の概要に書いてますね。

正規表現

正規表現とは?

正規表現は、文字列の検索、置換をするときの、便利な書式です。 私を含め、知らない人には書式を覚えるのが面倒ですが、 覚えてしまえば、それは簡単にすごい文字列処理ができるらしいです。

例えば、身近なところでは、DOS窓で

dir *.txt
と入力すると、拡張子がtxtのファイル一覧が表示されますが、 こういう書式のすごいやつが正規表現です。

Javaは昔から文字列処理には適さないと言われてましたが、 正規表現のAPIが標準で組み込まれたことにより、けっこう便利に なるんじゃないでしょうか。 簡単ななツールはちょこっとperlでというパターンが多かったかも しれませんが、簡単なツールもちょこっとJavaでっていうのも いいかもしれません。

正規表現の利用1

HTMLのタグ置き換えプログラムを作ってみましょう。
変換前 変換後
< &lt;
> &gt;
& &amp;
" &quot;
' &#39;

String#replaceAll(String, String) を使うと超簡単です。

  public static String replace1(String s){
    s = s.replaceAll("<","&lt;");
    s = s.replaceAll(">","&gt;");
    //...
    return s;
  }

ああ、正規表現を使いました。満足。

で、終わってもいいんですが、 さすがにこれでは、正規表現というか、 Stringクラスの新しいメソッドを使っただけなんで、 もうちょっと行ってみましょう。

正規表現の利用2

正規表現のパッケージは、java.util.regexパッケージです。

このパッケージのPatternとMacherクラスを使います。 Patternクラスが正規表現を表すクラス。 MacherがPatternと入力文字列を使って、マッチングを行うクラスです。

基本的な流れはこんな感じです。

  1. 正規表現を指定してPatternを作る。
  2. 文字列を指定してMathcerを作る。
  3. Mathcerのメソッドを呼ぶ。
import java.util.regex.*;

public class Sample1 {

  /**
   * 文字列(入力シーケンス)が、
   * 正規表現 「(ほげ)*仮面」(0回以上のほげ + 仮面)
   * にマッチすればtrueを返す。
   */
  public static boolean isMatch(CharSequence input){

    // 1.正規表現を指定してPatternを作る
    Pattern p = Pattern.compile("(ほげ)*仮面");
    // 2.文字列を指定してMathcerを作る。
    Matcher m = p.matcher(input);
    // 3.Mathcerのメソッドを呼ぶ。
    boolean b = return m.matches();

    return b;
  }

  public static void main(String[] args) throws Exception{
    System.out.println(isMatch("仮面"));
    System.out.println(isMatch("ほげ仮面"));
    System.out.println(isMatch("ほげほげ仮面"));
    System.out.println(isMatch("ほげほげほげ仮面"));
    System.out.println(isMatch("あほあほ仮面"));
  }
}

このプログラムを実行すると、あほあほ仮面以外はすべて、trueになります

ちなみに引数の型がCharSequenceインターフェイスになっていますが、 これが入力シーケンスのインターフェイスで、 StringやStringBufferがこのインターフェイスを実装しています (だからStringを渡せる)。

Matcherの基本メソッドは大きく、上の全体をマッチするmatchs以外に、 先頭からマッチするlookAt、現在位置からマッチするfindなどがあります。

まあ、サラッとだからこんな感じでしょうか。 正規表現の書式を使いこなせば、いろいろできそうな感じ。

XML

J2SE1.4に含まれるXML

J2SE1.4に含まれるXMLの機能には大きく、 Parse(解析)とTransform(変換)の2つがあります。
機能 インターフェイス 実装
Parse(解析) javax.xml.parsers
org.w3c.dom
org.xml.sax
Crimson
(org.apache.crimson)
Transform(変換) javax.xml.transform Xalan
(org.apache.xalan)

Parseの実装にはCrimson、 Transformの実装にはXalanが使われています。

ツール(実装)については、 @IT XML関連Javaテクノロジーの現在 を読むともうちょいわかるかも。

Parseは、さらにSAXとDOMという2つのパース方法があります。

ここでは、SAX、DOM、XSLTで、以下のhello.xmlからhelloというテキスト を取得し、標準出力に出力するプログラムを作ってみます。

hello.xml

<?xml version="1.0" encoding="Shift_JIS"?>
<message>hello</message>

DOMを使う

DOMはXML文書をメモリ上にオブジェクトとして展開し、 オブジェクトを操作、検索することで、パースします。 また、XMLを編集するのはDOMが適しています。

SimpleDom.java

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

public class SimpleDom {

  public static void main(String[] args) throws Exception{

    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document doc = builder.parse(new File("hello.xml"));

    Element root = doc.getDocumentElement();
    Node node = root.getFirstChild();
    System.out.println(node);
  }
}

SAXを使う

SAXは、イベントハンドラを用意しておいて、 XML文書を読み込みながら、イベントを処理していきます。 パースはDOMより高速に行うことができます。

SimpleSax.java

import java.io.File;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SimpleSax extends DefaultHandler {

  public void startElement(
    String namespaceURI,
    String localName,
    String qName,
    Attributes atts)
    throws SAXException {
    
    System.out.println(qName);
  }


  public static void main(String[] args) throws Exception{

     SAXParserFactory factory = SAXParserFactory.newInstance();
     SAXParser parser = factory.newSAXParser();
     
     parser.parse(new File("hello.xml"), new SimpleSax());
  }
}

DOMとSAXについては、 @IT XMLを操作する方法、「DOM」と「SAX」を見るともう少しわかります。

XSLTを使う

XSLTはXML文書を他の文書に変換するときに使います。 XSLに変換ロジックを記述し、XML文書を変換します。

hello.xsl

<?xml version="1.0" encoding="Shift_JIS"?>

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

<xsl:output method="text"/>

<xsl:template match="message">
  <xsl:value-of select="."/>
</xsl:template>

</xsl:stylesheet>

SimpleXSLT.java

import java.io.File;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public class SimpleXSLT {

  public static void main(String[] args) throws Exception{

    StreamSource xsl = new StreamSource(new File("hello.xsl"));
    StreamSource xml = new StreamSource(new File("hello.xml"));
    StreamResult out = new StreamResult(System.out);

    TransformerFactory factory = TransformerFactory.newInstance();
    Transformer transformer = factory.newTransformer(xsl);
    transformer.transform(xml, out);
  }
}
そんな感じ。。。
TOP