4

这是有效的,但使用模式和 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 并在编译模式之前短路验证吗?或者在任何情况下都将被检查?它是否因解析器而异?

我承认这里的性能差异可能很小。我还希望正则表达式引擎也可以缩短长度约束——但这比我可能关心的更深层次。

抛开性能不谈,我认为我更喜欢将它全部包含在模式中,但这可能反映了我对正则表达式的舒适程度,而不是典型的最佳实践。

谢谢!

4

2 回答 2

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> 

这将是描述它的最简单方法,并且可能更快,因为您现在正在执行整数检查,而不是正则表达式检查。

于 2012-10-18T01:18:56.073 回答
-1

在某种程度上,你的问题也有一个有趣的一面......因为即使你在翻译最后一个模式时也犯了一个错误(+意味着一个或多个,你想要*的),它证明了一些人会说正则表达式的一点,一个正则表达式可能会很棘手。无论我们喜欢与否,Regex 对许多人来说都是一场斗争。

我坚信“让事情尽可能简单,但不要简单”。

如果可以不用正则表达式,请远离它(见上文)。尽可能多地参考内置类型和提供的方面(我认为对你来说唯一有效的情况是如果你想允许前导零,否则带有约束方面的 unsignedint 也会这样做)。

如果你不能,但正则表达式可以做到,请不要犹豫使用它。

永远不要重复你的“要求”——维护是最重要的原因。不可否认,有机会获得额外的 CPU 周期,但除非有人故意过度使用它,正如你所说的那样,开销很可能是最小的。

我认为如果你坚持这些原则,你的问题就会消失......

于 2012-10-18T00:14:11.270 回答