反斜线在正则表达式的XSD与XJC(蚂蚁)和JAXB验证

问题描述:

,我有以下的正则表达式类型在我的xsd文件:反斜线在正则表达式的XSD与XJC(蚂蚁)和JAXB验证

<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蚂蚁产生,我收到以下异常:

[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的工作?

编辑:

不错啊,发现现在的答案,似乎是在XJC正则表达式的支持。 “\ B” AINT。让他们解决问题,它现在生成没有错误,似乎在运行时工作。好极了! :)

虽然有人知道这是否安全,没有字边界?也许有另一种选择?

XML模式规范中定义的正则表达式不支持字边界。

在你的情况下,不需要边界这个词。 XML模式类型中的模式方面始终要求正则表达式匹配整个字符串,就好像正则表达式以字符串起始锚点^\A开始,并以字符串尾部结尾$\z结束。因为XML模式正则表达式总是匹配整个字符串,所以您也不能在正则表达式中使用这些锚。