我正在尝试通过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})匹配..。
唯一成员为星号的字符类- C. M. Sperberg-McQueen
...zero时间,这意味着空字符串或空XML节点值。第二个子句匹配([0-9]{1,10}\-[0-9]{1,2}\-[0-9]{1,6})“1到10位数字,连字符,1到2位数字,连字符,1到6位数字”。
但SEC拒绝与上述简单类型对应的XML节点,该节点具有空值或空值。
在我的方法中,这是一个特殊的模式。对于我测试过的每一种简单类型(在SEC的EDGAR模式中由regex模式定义的),包括多个模式,以及简单regex类型的联合,我的方法是有效的。这是我正在生成XML的一个表达式,我认为它是有效的,但SEC拒绝。
所以这是一次精神健康检查。如果我包装上面的模式表达式^(<expr>)$,并测试空字符串或空字符串,由于第一个子句,在C#和js中都匹配。对,是这样?我是不是遗漏了一些关于XSD正则表达式的东西?
对于js示例,使用regex101.com
风味: javascript
正则表达式:^(*{0}x 0-9{1,10}-0-9{1,2}-0-9{1,6})$
改性剂:全球机制
测试字符串:
1-1-1
3
5
6-6-6匹配:第1、2、4、6行
但SEC本质上告诉我,表达式应该只匹配1和6。
@kjhughes
不,不允许空白(单个空格字符)。
为了减轻困惑,我清理了一些语句,并将“空白”替换为“空”。我指的是在C# (== "")或js (=== "")中为空的字符串。我希望该值被视为空值,并由^([*]{0}|...)$ (js: /^([*]{0}|...)$/)进行匹配。正在测试的XML片段最终将是:
...
<ns:ACCESSION_NUMBER_TYPE></ns:ACCESSION_NUMBER_TYPE>
...XSD中的正则表达式在开始和结束时以^和$隐式锚定。
我相信我理解xsd规范中关于隐式锚定的部分,这就是为什么我一直试图将其转换为C#或js验证,方法是在上面的示例中显式地将xsd模式包装在开始行、捕获、结束行(^(...)$)锚点中。对于js,它还将被包装在/.../中。
这难道不是一个安全的假设吗?这适用于EDGAR模式中的每一种模式,这些模式在多个月和几个不同的上下文中被许多最终用户使用过。这大约是60个模式,我没有看到任何问题。
这就是为什么我对模式在XSD正则表达式范围内的实际含义的评估很有信心,而--我同意您的答案--关于处理空值的问题。您是否会将其扩展到C#/js空字符串,这将导致像我前面所示的XML节点?也许我已经超出了我自己问题的范围。
发布于 2015-04-02 15:54:43
对于上述简单类型,我认为将允许空值或空值。
是的,允许使用空值(零长度字符串).
不,允许空白(单个空格字符)不允许。
如果我包装上面的模式表达式^()$,并测试空字符串或空字符串,由于第一个子句,它在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或任何其他语言中的空字符串。
https://stackoverflow.com/questions/29416697
复制相似问题