作成 2002/10/22
更新 2002/10/23
今更ですが、J2SE1.4の新機能を簡単に調査したいと思います。 何だかいっぱいあるので、目につくものだけ、 簡単にさらーといってみたいと思います。
ひととおりのことは、J2SE1.4のドキュメントの新機能の概要に書いてますね。
正規表現は、文字列の検索、置換をするときの、便利な書式です。 私を含め、知らない人には書式を覚えるのが面倒ですが、 覚えてしまえば、それは簡単にすごい文字列処理ができるらしいです。
例えば、身近なところでは、DOS窓で
dir *.txtと入力すると、拡張子がtxtのファイル一覧が表示されますが、 こういう書式のすごいやつが正規表現です。
Javaは昔から文字列処理には適さないと言われてましたが、 正規表現のAPIが標準で組み込まれたことにより、けっこう便利に なるんじゃないでしょうか。 簡単ななツールはちょこっとperlでというパターンが多かったかも しれませんが、簡単なツールもちょこっとJavaでっていうのも いいかもしれません。
HTMLのタグ置き換えプログラムを作ってみましょう。
| 変換前 | 変換後 |
|---|---|
| < | < |
| > | > |
| & | & |
| " | " |
| ' | ' |
String#replaceAll(String, String)
を使うと超簡単です。
public static String replace1(String s){
s = s.replaceAll("<","<");
s = s.replaceAll(">",">");
//...
return s;
}
ああ、正規表現を使いました。満足。
で、終わってもいいんですが、 さすがにこれでは、正規表現というか、 Stringクラスの新しいメソッドを使っただけなんで、 もうちょっと行ってみましょう。
正規表現のパッケージは、java.util.regexパッケージです。
このパッケージのPatternとMacherクラスを使います。 Patternクラスが正規表現を表すクラス。 MacherがPatternと入力文字列を使って、マッチングを行うクラスです。
基本的な流れはこんな感じです。
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
| 機能 | インターフェイス | 実装 |
|---|---|---|
| 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は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は、イベントハンドラを用意しておいて、 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は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);
}
}
そんな感じ。。。