0

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" がサポートされていないようです。それらを除外すると問題が修正され、エラーなしで生成され、実行時に機能するようになりました。わーい!:)

これが単語の境界なしで安全かどうかは誰にもわかりますか? 多分代替案はありますか?

4

1 に答える 1

0

XML スキーマ仕様で定義されている正規表現フレーバーは、単語境界をサポートしていません。

あなたの場合、単語の境界は必要ありません。XML スキーマ型のパターン ファセットでは、正規表現が文字列開始アンカーorで始まり、文字列終了アンカー^or\Aで終わっているかのように、常に正規表現が文字列全体に一致する必要があります。XML スキーマの正規表現は常に文字列全体と一致するため、これらのアンカーを正規表現で使用することもできません。$\z

于 2010-07-04T06:30:16.583 に答える