2012-10-17 62 views
3

這是有效的,但利用模式和最大長度,以強制執行複製的長度的限制:XSD長度限制選項

<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> 

或者該模式可以簡化,我們將依靠最大長度:

<xsd:restriction base="xsd:string"> 
     <xsd:pattern value="[0-9]*" /> 
     <xsd:maxLength value="10" /> 
    </xsd:restriction> 

問題:

是否有已知的性能影響選擇其中之一? 任何給定的解析器在編譯模式之前首先檢查len並短路驗證,如果兩者都被提供的話? 或者兩者都會在任何情況下檢查? 它從解析器到解析器有所不同嗎?

我承認這裏的性能差異可能是最小的。我也期望正則表達式引擎也可以短路,這是一個長度限制 - 但這比我可能關心的更深。

除了表現之外,我認爲我更喜歡在模式中使用它,但這可能會反映出我的舒適度與正則表達式而非典型的最佳做法。

謝謝!

+1

避免選項1可能會導致矛盾維護(即,如果某人希望將最大長度改爲12個字符,只有更新的最大長度,而無需重新評估模式會有問題。選項3有最大長度的優勢是從可接受的字符清晰,獨特的 - 所以,如果這兩個都可能independantly彼此的改變,這是認知更加清晰(而對於像一個郵編你想要的圖案一切表明,模式和長度被鏈接) 。 – JohnLBevan

+0

可悲的是,我不能回答你的問題的表現部分(超過答案因此評論)。我懷疑不同的解析器不同,雖然實現這個,給你不同的結果(一般最少)這是一個猜測,雖然 – JohnLBevan

回答

-1

在某種程度上,你的問題有一個有趣的方太......既然連你在翻譯的最後一個模式做了一個錯誤(+意味着一個或多個,你想*代替),它證明了一點,有些人會說關於正則表達式,這是正則表達式可能會很棘手。正則表達式對很多人來說都是一場鬥爭,不管我們喜歡與否。

我堅信「讓事情儘可能簡單,但並不簡單」。

如果你可以沒有正則表達式,遠離它(見上文)。參考儘可能多的內置類型和提供的方面(我認爲唯一有效的例子是如果你想允許前導零,否則具有約束方面的unsignedint會做同樣的)。

如果你不能,但正則表達式可以做到這一點,不要猶豫,使用它。

永不復制您的「要求」 - 維護是最重要的原因。不可否認,有額外的CPU週期的機會,但除非有人故意過度,正如你所說的那樣,開銷很可能是最小的。

我認爲,如果你堅持這些原則,你的問題種下去了......

+0

大聲笑是的,我應該使用* insteasd +來使示例成爲consis帳篷。正確。我同意沒有重複「要求」的觀點。爲了完整,包含了這個例子。 –

0

是您的代碼意味着是一個數字或數字字符串?我的意思是允許前導零?如果不是,你可以讓你的數據類型,甚至使其XSD的限制簡單:

<xsd:restriction base="xsd:integer"> 
    <xsd:maxLength value="10" /> 
</xsd:restriction> 

<xsd:restriction base="xsd:integer"> 
    <xsd:maxExclusive value="10000000000"/> 
</xsd:restriction> 

這會:最大長度或最大值,如任一整數要描述它,也可能更快,因爲你現在正在做的,而不是一個正則表達式來檢查一個整數檢查,最簡單的方法。因爲這種重複

+0

我認爲你應該糾正你的帖子。尾隨零通常是允許的,這是** **領先者造成的問題,如'具體來說,前導零prohibited.' - 我在這裏講的無符號數。爲什麼沒有簽名?因爲在他的模式中他不允許使用符號,其他所有數字都可以前面加上正號(「+」)或負號(「 - 」)# –

+0

我按照您的建議糾正了它,謝謝你的選擇。如果原始問題是控制只包含數字的字符串,如信用卡或ID號,則您的解決方案將是正確的。但是,如果他們存儲像價格或數量的實際數字,則數字數據類型會更好。 – 2012-10-18 04:07:24

+0

是的,這就是爲什麼我的帖子說'我會認爲你唯一有效的情況[使用字符串與數字模式]是如果你想允許前導零,否則一個** unsignedint約束方面**會做你也必須假定他不想要+/-符號,因此我使用了無符號類型。 –