validationのmask その2

maskを使った正規表現チェックをする際,
maskとして,に直接正規表現を記載するわけだけども,そこでHTMLエスケープが必要なものを指定したくなったらどうするかという話.
具体的な例を挙げると,入力された文字列が,Windowsのファイル名に使用できるかどうかをチェックしたい時とかで,
Windowsのファイル名としては<>.?/\が使えない(らしい)から,

^[<>.?/\]*$

なんて正規表現のチェックになる.(たぶん)

さて,この中で,?やら/は正規表現特殊文字に該当するので,\でエスケープしてやる.
じゃあ


^[<>\.\?\\]*$

を,validation.xmlに記載すると,今度は<と>がxmlのパースエラーになってしまう.

2006/09/06 11:49:34 org.apache.commons.digester.Digester fatalError
致命的: Parse Fatal Error at line 94 column 27: The content of elements must consist of well-formed character data or markup.
org.xml.sax.SAXParseException: The content of elements must consist of well-formed character data or markup.
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at org.apache.commons.digester.Digester.parse(Digester.java:1591)
at org.apache.commons.validator.ValidatorResources.(ValidatorResources.java:159)
at org.apache.struts.validator.ValidatorPlugIn.initResources(ValidatorPlugIn.java:237)
at org.apache.struts.validator.ValidatorPlugIn.init(ValidatorPlugIn.java:162)
(長いので中略)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
at java.lang.Thread.run(Thread.java:534)

てなわけで,<と>については,HTMLのエスケープ記法を用いさらに,\でエスケープする.


<var>
mask
^[^\&lt;\&gt;\.\?\/\\]*$
</var>

という感じ.
正規表現エスケープと,XML(HTML)のエスケープが混在するので,えらい見にくい気がするけどしょうがないのかな.


※なんかバックスラッシュが¥と表示されたり,\と表示されたりしてるので,適宜読み替えてください.