XSD正则表达式:空字符串或其他内容

时间:2015-04-02 15:25:46

标签: javascript c# regex xml xsd

我试图通过C#或js强制执行我在SEC的EDGAR模式中找到的XSD正则表达式。

我有以下XSD简单类型:

<xs:simpleType name="ACCESSION_NUMBER_TYPE">
    <xs:restriction base="xs:token">
        <xs:pattern value="[*]{0}|[0-9]{1,10}\-[0-9]{1,2}\-[0-9]{1,6}"/>
    </xs:restriction>
</xs:simpleType>

恰好来自eis_Common.xsd,包含在您可以从SEC's EDGARLink Online page开始的zip文件中。可以在eis_ABS_15GFiler.xsd中找到近似重复的定义,但该类型限制的基础是xs:string

<xs:simpleType name="ACCESSION_NUMBER_TYPE">
    <xs:restriction base="xs:string">
        <xs:pattern value="[*]{0}|[0-9]{1,10}\-[0-9]{1,2}\-[0-9]{1,6}"/>
    </xs:restriction>
</xs:simpleType>

对于上面的模式,我认为允许使用空值或空值。我将上述模式翻译成两个子句,或者一起翻译。第一个子句([*]{0})匹配......

  

唯一成员为星号的角色类 - C. M. Sperberg-McQueen

...零次,这意味着空字符串或空XML节点值。第二个子句匹配([0-9]{1,10}\-[0-9]{1,2}\-[0-9]{1,6})&#34;一到十个数字,连字符,一到两个数字,连字符,一到六个数字&#34;。

但SEC拒绝与上述简单类型对应的XML节点,该节点具有null或空值。

这种特殊模式是我的方法中的例外。对于我测试过的每个其他简单类型,这些类型是通过正则表达式模式在SEC的EDGAR模式中定义的,包括多个模式和简单正则表达式类型的联合,我的方法可行。正是这一个表达式,我生成的XML,我认为是有效的,但SEC拒绝。

所以这是一个完整性检查。如果我包装上面的模式表达式^(<expr>)$,并针对空字符串或空字符串进行测试,则由于第一个子句, 在C#和js中匹配 。正确?我错过了一些关于XSD正则表达式的东西吗?


对于js样本,请使用regex101.com

风味:javascript

正则表达式:^([*] {0} | [0-9] {1,10} - [0-9] {1,2} - [0-9] {1,6})$ < / p>

修饰符:gm

测试字符串:

1-1-1

3

5
6-6-6

匹配:第1,2,4,6行

但SEC基本上告诉我表达式应该只匹配1和6。


@kjhughes

  

不,不允许空白(单个空白字符)。

为了缓解混乱,我清理了一些措辞并取代了#34;空白&#34;用&#34;空&#34;。我的意思是在C#(== "")或js(=== "")中为空的字符串。我希望将其视为空值,并与^([*]{0}|...)$js: /^([*]{0}|...)$/)匹配。正在测试的XML片段最终将是:

...
<ns:ACCESSION_NUMBER_TYPE></ns:ACCESSION_NUMBER_TYPE>
...
  

XSD中的正则表达式以^和$。

隐式锚定在开头和结尾

我相信我理解了关于隐式锚定的xsd规范的部分,这就是为什么我一直试图将其转换为C#或js regex验证,通过在开始行,捕获,结束行中显式包装xsd模式( ^(...)$)锚点在上面的例子中。对于js,它还会包含在/.../中。

这不是一个安全的假设吗?这适用于EDGAR模式中的所有其他模式,这些模式已经被许多最终用户在几个月的过程中使用,以及几种不同的上下文。这是我见过的大约60种模式没有问题。

这就是为什么我有信心评估模式在XSD正则表达式范围内的实际含义,以及 我同意 与您的答案 关于null 值的处理。你会把它扩展到一个C#/ js空字符串,这将产生一个像我上面说明的XML节点吗?也许我已经超出了我自己的问题的范围:D

1 个答案:

答案 0 :(得分:4)

  

对于上面的简单类型,我认为是空值或空值   将被允许​​。

是的,允许空值(零长度字符串)

不,空白(单个空格字符)将

  

如果我包装上面的模式表达式,^()$,并针对a进行测试   null或空字符串,由于第一个字符串,它在C#和js中都匹配   条款。正确?我错过了一些关于XSD正则表达式的内容吗?

XSD中的正则表达式在^$的开头和结尾处隐式锚定。

根据spec

  

注意:与一些流行的正则表达式语言(包括   那些由Perl和标准Unix实用程序定义的,常规的   这里定义的表达式语言隐式锚定所有常规   头部和尾部的表情,作为常规的最常见用法   ·pattern·中的表达式是为了匹配整个文字。


进一步更新OP问题编辑

是的,非常具体,这个XML:

<a></a>

对此XSD有效:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:simpleType name="ACCESSION_NUMBER_TYPE">
    <xs:restriction base="xs:string">
      <xs:pattern value="[*]{0}|[0-9]{1,10}\-[0-9]{1,2}\-[0-9]{1,6}"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:element name="a" type="ACCESSION_NUMBER_TYPE"/>

</xs:schema>
  

你会将它扩展为C#/ js空字符串,这将导致一个   像我上面说明的XML节点?

上面显示的空元素(如a)的字符串值将是C#,JavaScript,Java,Python或任何其他语言的空字符串。