xsd ファイルに次の正規表現タイプがあります。
<xsd:simpleType name="Host">
<xsd:restriction base="xsd:string">
<xsd:pattern
value="\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b">
</xsd:pattern>
</xsd:restriction>
</xsd:simpleType>
xjc を介して ant でこれから生成すると、次の例外が発生します。
[xjc] [ERROR] InvalidRegex: Pattern value '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b' is not a valid regular expression. The reported error was: 'This expression is not supported in the current option setting.' at column '2'.
[xjc] line 10 of file:/.../src/META-INF/portscan.xsd
すべてのバックスラッシュ () を 2 つのバックスラッシュ (\) に変更することで、これを修正できます。
<xsd:simpleType name="Host">
<xsd:restriction base="xsd:string">
<xsd:pattern
value="\\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b">
</xsd:pattern>
</xsd:restriction>
</xsd:simpleType>
しかし、マーシャリング中に検証が実行されると、次の例外が発生します。
Caused by - class org.xml.sax.SAXParseException: cvc-pattern-valid: Value '80.245.120.45' is not facet-valid with respect to pattern '\\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b' for type 'Host'.
明らかに、二重バックスラッシュ (\\) が検証の失敗の原因です。しかし、単一のバックスラッシュをエンコードして xjc を機能させるにはどうすればよいでしょうか?
編集:
ああ、答えが見つかりました。xjc regexp では "\b" がサポートされていないようです。それらを除外すると問題が修正され、エラーなしで生成され、実行時に機能するようになりました。わーい!:)
これが単語の境界なしで安全かどうかは誰にもわかりますか? 多分代替案はありますか?