我试图通过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
答案 0 :(得分:4)
对于上面的简单类型,我认为是空值或空值 将被允许。
是的,允许空值(零长度字符串) 。
不,空白(单个空格字符)将 不 。
如果我包装上面的模式表达式,^()$,并针对a进行测试 null或空字符串,由于第一个字符串,它在C#和js中都匹配 条款。正确?我错过了一些关于XSD正则表达式的内容吗?
XSD中的正则表达式在^
和$
的开头和结尾处隐式锚定。
根据spec:
注意:与一些流行的正则表达式语言(包括 那些由Perl和标准Unix实用程序定义的,常规的 这里定义的表达式语言隐式锚定所有常规 头部和尾部的表情,作为常规的最常见用法 ·pattern·中的表达式是为了匹配整个文字。
是的,非常具体,这个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或任何其他语言的空字符串。