这是有效的,但是使用模式和maxLength复制长度约束来强制执行它:
<xsd:simpleType name="MyType">
<xsd:restriction base="xsd:string">
<xsd:pattern value="[0-9]{0,10}" />
<xsd:maxLength value="10" />
</xsd:restriction>
</xsd:simpleType>
仅这种模式就足够了:
<xsd:restriction base="xsd:string">
<xsd:pattern value="[0-9]{0,10}" />
</xsd:restriction>
或者模式可以简化,我们将依赖于maxLength:
<xsd:restriction base="xsd:string">
<xsd:pattern value="[0-9]*" />
<xsd:maxLength value="10" />
</xsd:restriction>
问题:
选择其中一个是否存在已知的性能影响? 任何给定的解析器是否会先检查len并在编译模式之前将验证短路(如果两者都被提供的话)? 或者两者都会被检查? 它是否从解析器到解析器各不相同?
我承认这里的性能差异可能很小。我还期望正则表达式引擎也可以短路是一个长度约束 - 但这比我可能关心的水平要深。
除了性能之外,我认为我更喜欢在模式中使用它,但这可能会使我的舒适程度与正则表达式相比而不是典型的最佳实践。
谢谢!
答案 0 :(得分:0)
您的代码是数字还是数字字符串?我的意思是允许领先的零?如果它们不是,您可以通过将xsd:integer限制为最大长度或最大值(例如:)来使您的数据类型更简单:
<xsd:restriction base="xsd:integer">
<xsd:maxLength value="10" />
</xsd:restriction>
或
<xsd:restriction base="xsd:integer">
<xsd:maxExclusive value="10000000000"/>
</xsd:restriction>
这将是描述它的最简单方式,并且可能更快,因为您现在正在进行整数检查,而不是正则表达式检查。
答案 1 :(得分:-1)
在某种程度上,你的问题也有一个有趣的方面......因为即使你在翻译最后一个模式时犯了一个错误(+
意味着一个或多个,你想要*
),它证明了一些人会说正则表达式的一点,正则表达式可能会很棘手。无论我们喜不喜欢,正则表达式对许多人来说都是一场斗争。
我坚信“让事情尽可能简单,但不要简单”。
如果没有正则表达式,请远离它(见上文)。尽可能多地参考内置类型和提供的方面(我认为唯一有效的情况是你想要允许前导零,否则带有约束方面的unsignedint会做同样的事情。)
如果你不能,但正则表达式可以做到,请不要犹豫使用它。
永远不要复制您的“要求” - 维护是最重要的原因。不可否认,有可能有额外的CPU周期,但除非有人故意过度使用它,正如你所说,开销很可能是最小的。
我认为如果你坚持这些原则,你的问题就会消失......