[英]XSD regular expressions: empty string OR something else
我试图通过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,包含在您可以从美国证券交易委员会的EDGARLink在线页面下载的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}
)匹配......
唯一成员为星号的角色类 - CM Sperberg-McQueen
...零次,这意味着空字符串或空XML节点值。 第二个子句匹配( [0-9]{1,10}\\-[0-9]{1,2}\\-[0-9]{1,6}
)“一到十位数,连字符,一个到两位数,连字符,一到六位数字“。
但SEC拒绝与上述具有null或空值的简单类型对应的XML节点。
这种特殊模式是我的方法中的例外。 对于我测试过的每个其他简单类型,我在SEC的EDGAR模式中通过正则表达式模式定义,包括多个模式和简单正则表达式类型的联合,我的方法可行。 正是这一个表达式,我生成的XML,我认为是有效的,但SEC拒绝。
所以这是一个完整性检查。 如果我包装上面的模式表达式^(<expr>)$
,并针对null或空字符串进行测试,则由于第一个子句,它在C#和js中都匹配 。 正确? 我错过了一些关于XSD正则表达式的东西吗?
对于js样本,请使用regex101.com
味道:javascript
正则表达式:^([*] {0} | [0-9] {1,10} - [0-9] {1,2} - [0-9] {1,6})$
修饰符:gm
测试字符串:
1-1-1
3
5
6-6-6
比赛:第1,2,4,6行
但美国证券交易委员会基本上告诉我表达式应该只匹配1和6。
@kjhughes
不,不允许空白(单个空白字符)。
为了缓解混乱,我清理了一些措辞并用“空”代替“空白”。 我的意思是在C#( == ""
)或js( === ""
)中为空的字符串。 我希望将其视为空值,并与^([*]{0}|...)$
( js: /^([*]{0}|...)$/
^([*]{0}|...)$
js: /^([*]{0}|...)$/
)。 正在测试的XML片段最终将是:
...
<ns:ACCESSION_NUMBER_TYPE></ns:ACCESSION_NUMBER_TYPE>
...
XSD中的正则表达式以^和$隐含地锚定在开头和结尾。
我相信我理解了关于隐式锚定的xsd规范的部分,这就是为什么我一直试图将其转换为C#或js正则表达式验证,通过在开始行,捕获,结束行中显式地包装xsd模式( ^(...)$
)锚点在上面的例子中。 对于js,它还将包装在/.../
。
这不是一个安全的假设吗? 这适用于EDGAR模式中的所有其他模式,这些模式已经被许多最终用户在几个月的过程中使用,以及几种不同的上下文。 这是我见过的大约60种模式没有问题。
这就是为什么我对我在XSD正则表达式范围内实际意味着什么的评估有信心,并且我同意你关于空值处理的答案。 你会把它扩展到一个C#/ js空字符串,这将产生一个像我上面说明的XML节点吗? 也许我已经超出了我自己的问题的范围:D
对于上面的简单类型,我认为将允许空值或空值。
是的, 将允许空值(零长度字符串)。
不,一个空白的(单一空白字符)将不会被允许。
如果我包装上面的模式表达式^()$,并针对null或空字符串进行测试,则由于第一个子句,它在C#和js中都匹配。 正确? 我错过了一些关于XSD正则表达式的东西吗?
XSD中的正则表达式以^
和$
隐含地锚定在开头和结尾。
根据规格 :
注意 :与一些流行的正则表达式语言(包括由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,或任何其他语言空字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.