обратная косая черта в регулярных выражениях в xsd с проверкой xjc (ant) и jaxb - PullRequest
0 голосов
/ 28 июня 2010

В моем файле 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>

При генерации из ant в xjc я получаю следующее исключение:

  [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

Я могу это исправить, изменив каждый обратный слеш () на двойной (\):

<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?

Edit:

Что ж, нашёл ответ сейчас, похоже, что \ b не поддерживается в регулярных выражениях xjc. Оставив их, исправили проблему, теперь она генерируется без ошибок и, похоже, работает во время выполнения. Ура! :)

Хотя кто-нибудь знает, безопасно ли это без границ слова? Может быть, есть альтернатива?

1 Ответ

0 голосов
/ 04 июля 2010

Вариант регулярного выражения, определенный в спецификации схемы XML, не поддерживает границы слов.

В вашем случае границы слов не нужны.Фасеты шаблонов в типах схем XML всегда требуют, чтобы регулярное выражение совпадало со всей строкой, как если бы регулярное выражение начиналось с привязки начала строки ^ или \A и заканчивалось привязкой конца строки $или \z.Поскольку регулярные выражения схемы XML всегда соответствуют всей строке, вы также не можете использовать эти привязки в своих регулярных выражениях.

...