XML 模式中正则表达式的正确语法
Proper syntax of regex in XML Schema
我有用于验证手机号码的正则表达式。它在 PHP 和 JS 中工作,但是当我尝试在 xml 模式中实现它时,我收到错误消息“针对 my.xsd 的请求 XSD 验证失败。"failed to compile: xmlFAParseAtom: expecting ')'","failed to compile: xmlFAParseRegExp: extra characters","Element '{http://www.w3.org/2001/XMLSchema}pattern': The value of the facet 'pattern' is not a valid regular expression."
我的例子 XSD
<xs:simpleType name="mobile-number">
<xs:restriction base="xs:string">
<xs:pattern value="(?:(?:\(?(?:0(?:0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?(?:\(?0\)?[\s-]?)?)|(?:\(?0))(?:(?:\d{5}\)?[\s-]?\d{4,5})|(?:\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3}))|(?:\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4})|(?:\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}))(?:[\s-]?(?:x|ext\.?|\#)\d{3,4})?"/>
</xs:restriction>
</xs:simpleType>
我也只试了这部分(?:(?:\(?(?:0(?:0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?(?:\(?0\)?[\s-]?)?)|(?:\(?0))
但得到了同样的错误
模式中有14组,都是非捕获。 XSD Schema regex syntax 不支持这样的分组构造,您需要将所有非捕获组 ((?:...)
) 转换为捕获组 ((...)
)。
使用
<xs:pattern value="((\(?(0(0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?(\(?0\)?[\s-]?)?)|(\(?0))((\d{5}\)?[\s-]?\d{4,5})|(\d{4}\)?[\s-]?(\d{5}|\d{3}[\s-]?\d{3}))|(\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4})|(\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}))([\s-]?(x|ext\.?|#)\d{3,4})?" />
我有用于验证手机号码的正则表达式。它在 PHP 和 JS 中工作,但是当我尝试在 xml 模式中实现它时,我收到错误消息“针对 my.xsd 的请求 XSD 验证失败。"failed to compile: xmlFAParseAtom: expecting ')'","failed to compile: xmlFAParseRegExp: extra characters","Element '{http://www.w3.org/2001/XMLSchema}pattern': The value of the facet 'pattern' is not a valid regular expression."
我的例子 XSD
<xs:simpleType name="mobile-number">
<xs:restriction base="xs:string">
<xs:pattern value="(?:(?:\(?(?:0(?:0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?(?:\(?0\)?[\s-]?)?)|(?:\(?0))(?:(?:\d{5}\)?[\s-]?\d{4,5})|(?:\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3}))|(?:\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4})|(?:\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}))(?:[\s-]?(?:x|ext\.?|\#)\d{3,4})?"/>
</xs:restriction>
</xs:simpleType>
我也只试了这部分(?:(?:\(?(?:0(?:0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?(?:\(?0\)?[\s-]?)?)|(?:\(?0))
但得到了同样的错误
模式中有14组,都是非捕获。 XSD Schema regex syntax 不支持这样的分组构造,您需要将所有非捕获组 ((?:...)
) 转换为捕获组 ((...)
)。
使用
<xs:pattern value="((\(?(0(0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?(\(?0\)?[\s-]?)?)|(\(?0))((\d{5}\)?[\s-]?\d{4,5})|(\d{4}\)?[\s-]?(\d{5}|\d{3}[\s-]?\d{3}))|(\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4})|(\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}))([\s-]?(x|ext\.?|#)\d{3,4})?" />