XML模式正则表达式是Perl-ish。为什么这是允许的?

时间:2017-09-08 14:21:38

标签: regex xml validation xsd

我正在为一些交换格式处理XSD文件。标题表示我们存在符合XML schema(2001年的一个,1.0)的文档,并且这是该文档的0.4.0版本。此外,注释表明该文档是由Altova XMLSpy v2015创建的:

<!-- W3C Schema generated by XMLSpy v2015 rel. 3 (x64) 
     (http://www.altova.com)  Payment Instructions -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="0.4.0">

此文件定义了一种描述IBAN的类型,xs:string被限制为匹配某个正则表达式:

<xs:simpleType name="IBANType">
   <xs:restriction base="xs:string">
      <xs:pattern value="^$||([A-Z]{2,2}[0-9]{2,2}[A-Z0-9]{1,30})||(\.)"/>
   </xs:restriction>
</xs:simpleType>

现在给出的正则表达式似乎不符合相当受限制的standard XML Schema regex。特别是,它使用^$并重复模式{x,y} (更正:允许重复模式,可以在the W3C XSD primer中找到。使正则表达式成为有效的XSD正则表达式,虽然它接受字符串^$并且使用了太多|。)确实,如果||被{{1}替换},我们得到Perl regex

  1. | ==“空字符串”
  2. ^$
  3. | == 2 x alpha,2 x digit,1-30 x alpha或digit
  4. ([A-Z]{2,2}[0-9]{2,2}[A-Z0-9]{1,30})
  5. | ==一个点(分组括号是多余的)
  6. 这确实与IBAN格式相匹配,并且涵盖了两个特殊情况“缺失数据”和“缺少数据,由一个点代替”(两者都可以通过将元素排除而更优雅地处理,但这不在我的问题范围)。

    有人期望XSD验证器的实现会抱怨这样的正则表达式,但是没有。我通过处理XSD文件从(\.)获得有效的javax.xml.validation.Validator:没问题,没有警告,实际上验证器似乎正确地使用该正则表达式来检查输入。

    怎么可能?这里遵循什么规范,为什么Altova XMLSpy会生成这样的表达式?实现是否只是宽松,说“这看起来像一个Perl正则表达式,所以我将处理这样,看到我不在乎”?

2 个答案:

答案 0 :(得分:3)

我认为这是一个有效的XSD正则表达式 - 但它可能并不意味着作者的意图

^$||([A-Z]{2,2}[0-9]{2,2}[A-Z0-9]{1,30})||(\.)

^$是普通字符,因此匹配字符串“^ $”

A||B表示A或无或B

XSD正则表达式方言中允许

{2,2}

\.匹配“。”字符

答案 1 :(得分:2)

为方便起见,一些XML Schema验证处理器将正则表达式的解析和解释外包给第三方库,使用&#34;原样&#34;。这导致他们在这方面没有完全遵循规范。

即使处理器更宽松并且接受XML Schema正则表达式语言的超集,在设计模式时,强烈建议坚持XML Schema规范允许的内容并避免使用额外的功能。这可以确保其他XML Schema处理器能够以相同的方式接受和处理模式(互操作性)。

更有问题的是,如果实现不接受XML Schema允许的正则表达式,或者以不同方式解释它们,因为这会导致与100%兼容的模式的互操作性问题。