В моем файле 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. Оставив их, исправили проблему, теперь она генерируется без ошибок и, похоже, работает во время выполнения. Ура! :)
Хотя кто-нибудь знает, безопасно ли это без границ слова? Может быть, есть альтернатива?