2004/06/21

String のRegex 正規表現

Stringクラスにある正規表現を格納したストリングを引数とするメソッド。
これららを呼び出す時ハマった。

例えば、String#matches(String regex)
エスケープシーケンスの扱いで見事にハマった。
「\」を含む文字列を正規表現で探そうとした。
regex="\" で指定すると。当然「\」は「"」のエスケープシーケンス「\"」だとコンパイラに解釈される。ならば
regex="\\"
で指定すれば良いハズ。しっかりコンパイラもOK。じゃ、実行だ。
実行するとregexのクラスからExceptionが起きたと怒られる。
(?_?)なぜ。

真剣に悩むが解決せず。ふと。SQLをサーブレットから作成した時でエスケープシーケンスでハマったことを思い出す。
それで解決方法が分かった!
regex="\\\\"で通るのである。

この指定で。コンパイル&実行時にregex="\\"となり
正規表現でマッチングする時。"\\"をマッチング検索してくれる。(・∀・)イイ!!

つまり、マッチング時に正規表現がきっちり渡される必要があるわけです。
コンパイラのためのエスケープシーケンスと正規表現のためのエスケープシーケンスが両方ソースに書かれる必要があった。

意味不明な再帰的な処理なんだろう・・・

ところで、サーブレットからSQL作成でSQLエスケープシーケンスを使う時やJSPでJavaScriptを作成するときに、Javaソースコードにエスケープシーケンスを二回も書いてたらめんどくせー
と、俺と同じようなことを考ええるひとはゴマンとようです。
そこで、jakartaのcommonライブラリにおもしろいstatic classが用意されている。
org.apache.commons.lang.StringEscapeUtils#escapXxx( String )
org.apache.commons.lang.StringEscapeUtils#unescapXxx( String )
です。エスケープされるべき文字をエスケープシーケンスでエスケープし、
またエスケープシーケンスでエスケープされた文字からエスケープシーケンスを外してくれる。
JavaのStringクラスに含まれるエスケープされるべき文字をSQL用JS用にエスケープしてくれるメソッド群です。saticなので呼び出しも一発。なので覚えていたら結構使えると思う。
HTML、XMLのエスケープもイケテル。TextAreaのリクエスト処理する時などに便利ですね。

・・・・・・・・文字エスケープエスケープのオンパレードで読みにい。。。

escapeRegexもクラスに実装されないかなぁ。

ま、正規表現は頻繁に使い倒すので、Escapeするメソッドは自作しておくか・・・


それと、もう一つ。
フォルダ区切りの"\"バックスラッシュ(¥)ですが、これは、実はJavaのコード書く時あまり使わなくて良いようです。
Fileクラスをインスタンス化する時に
「\」(バックスラッシュ) ではなく 「/」(スラッシュ)でもファイルパスとして認識してくれます。
java.io.File#toURI()と言うクラスがあるんだから、
よく考えてたら、[/]でパス名を認識してもマッタク疑問はないわけです。
もし、Javaで無いとしたら、Windows側でサポートしてくれているのかな。。。
しかしパス名と言えば[\]バックスラッシュの先入観で作業をしてしまう(笑)
はっきり言えば、スラッシュ使った方がエスケープしなくて良いため便利です。

FileオブジェクトとStringの親和性の良さと考えて、後で読みやすいコードを意識すれば
ファイルオブジェクトは、バックスラッシュではなくスラッシュで利用した方が良いかもしれない。エスケープシーケンス減るから楽だし。
サーブレットで使うURIとローカルファイルのマッピングが結構便利かも知れぬぞ。
Comments: Post a Comment

<< Home

This page is powered by Blogger. Isn't yours?