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

Eri*_*ase 3 javascript c# regex xml xsd

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

\n\n

我有以下 XSD 简单类型:

\n\n
<xs:simpleType name="ACCESSION_NUMBER_TYPE">\n    <xs:restriction base="xs:token">\n        <xs:pattern value="[*]{0}|[0-9]{1,10}\\-[0-9]{1,2}\\-[0-9]{1,6}"/>\n    </xs:restriction>\n</xs:simpleType>\n
Run Code Online (Sandbox Code Playgroud)\n\n

它恰好来自 eis_Common.xsd,包含在 zip 文件中,您可以从SEC 的 EDGARLink 在线页面下载。可以在 eis_ABS_15GFiler.xsd 中找到几乎重复的定义,但该类型的限制的基础是xs:string

\n\n
<xs:simpleType name="ACCESSION_NUMBER_TYPE">\n    <xs:restriction base="xs:string">\n        <xs:pattern value="[*]{0}|[0-9]{1,10}\\-[0-9]{1,2}\\-[0-9]{1,6}"/>\n    </xs:restriction>\n</xs:simpleType>\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于上面的模式,我认为允许空白或空值。我将上述模式翻译为两个子句,通过 OR 组合在一起。第一个子句 ( [*]{0}) 匹配...

\n\n
\n

唯一成员为星号 \xe2\x80\x93 的字符类 CM Sperberg-McQueen

\n
\n\n

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

\n\n

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

\n\n

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

\n\n

所以这是一个健全性检查。如果我包装上面的模式表达式 ,^(<expr>)$并针对 null 或空字符串进行测试,由于第一个子句,它在 C# 和 js 中都会匹配。正确的?我是否遗漏了 XSD 正则表达式的某些内容?

\n\n
\n\n

对于 js 示例,使用 regex101.com

\n\n

风格:JavaScript

\n\n

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

\n\n

修饰符:gm

\n\n

测试字符串:

\n\n
1-1-1\n\n3\n\n5\n6-6-6\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n
\n\n

@kjhughes

\n\n
\n

不可以,不允许使用空格(单个空白字符)。

\n
\n\n

为了减轻混乱,我清理了一些措辞,并将“空白”替换为“空”。== ""我的意思是在 C# ( ) 或 js ( )中为空的字符串=== ""。我希望将其视为空值,并通过^([*]{0}|...)$( js: /^([*]{0}|...)$/) 进行匹配。正在测试的 XML 片段最终将是:

\n\n
...\n<ns:ACCESSION_NUMBER_TYPE></ns:ACCESSION_NUMBER_TYPE>\n...\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

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

\n
\n\n

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

\n\n

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

\n\n

这就是为什么我对 XSD 正则表达式范围内模式的实际含义的评估充满信心,并且我同意您关于空值处理的答案。您是否会将其扩展为 C#/js 空字符串,这将产生像我上面所示的 XML 节点?也许我已经超出了我自己问题的范围:D

\n

kjh*_*hes 5

\n

对于上面的简单类型,我认为空白或空值\n是允许的。

\n
\n\n

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

\n\n

不可以,不允许使用空格(单个空白字符)。

\n\n
\n

如果我包装上面的模式表达式 ^()$,并针对 \n null 或空白字符串进行测试,由于第一个\n 子句,它在 C# 和 js 中都会匹配。正确的?我是否遗漏了 XSD 正则表达式的某些内容?

\n
\n\n

XSD 中的正则表达式在开始和结束处隐式锚定为^$

\n\n

根据规范

\n\n
\n

注意:与一些流行的正则表达式语言(包括 Perl 和标准 Unix 实用程序定义的语言)不同,这里定义的正则表达式语言隐式地将所有正则表达式锚定在头部和尾部,这是正则最常见的用法\xc2\xb7pattern\xc2\xb7 中的 \n 表达式用于匹配整个文字。

\n
\n\n
\n\n

根据进一步的 OP 问题编辑进行更新

\n\n

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

\n\n
<a></a>\n
Run Code Online (Sandbox Code Playgroud)\n\n

针对此 XSD 有效:

\n\n
<?xml version="1.0" encoding="UTF-8"?>\n<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">\n\n  <xs:simpleType name="ACCESSION_NUMBER_TYPE">\n    <xs:restriction base="xs:string">\n      <xs:pattern value="[*]{0}|[0-9]{1,10}\\-[0-9]{1,2}\\-[0-9]{1,6}"/>\n    </xs:restriction>\n  </xs:simpleType>\n\n  <xs:element name="a" type="ACCESSION_NUMBER_TYPE"/>\n\n</xs:schema>\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

您是否会将其扩展为 C#/js 空字符串,这将导致像我上面所示的 \n XML 节点?

\n
\n\n

如上所示,空元素的字符串值a在 C#、JavaScript、Java、Python 或任何其他语言中都将是空字符串。

\n