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

ある意味では、あなたの質問には面白い面もあります...あなたでさえ、最後のパターンを翻訳する際に間違いを犯したので (+つまり、代わりに 1 つ以上を意味します*)、正規表現について何人かが言う点を証明します。正規表現はトリッキーになる可能性があります。正規表現は、好むと好まざるとにかかわらず、多くの人にとって苦労しています。

私は「物事を可能な限りシンプルにするが、それ以上シンプルにしない」ことを固く信じています。

正規表現なしでできる場合は、避けてください(上記を参照)。組み込み型と提供されたファセットを可能な限り参照してください (唯一の有効なケースは、先行ゼロを許可したい場合です。それ以外の場合は、ファセットを制約する unsignedint が同じことを行います)。

できなくても正規表現でできる場合は、ためらわずに使用してください。

「要件」を重複させないでください。メンテナンスが最も重要な理由です。余分な CPU サイクルが発生する可能性があることは否定できませんが、あなたが言ったように、誰かが意図的にやり過ぎていない限り、オーバーヘッドは最小限に抑えられる可能性が高いです。

これらの原則に固執すれば、疑問は解消されると思います...

于 2012-10-18T00:14:11.270 に答える