作成 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); } }そんな感じ。。。