2011-09-29 92 views
1

我試圖在需要使用正則表達式的xsd中驗證字符串。該字符串將採取以下形式...用於驗證字符串的正則表達式

JOE〜PETE〜SAM〜BOB

和以下被認爲是有效的...

JOE 
~PETE 
JOE~SAM~ 
~~~BOB 
JOE~PETE~~ 

而且,每個之間的名字〜最多隻能有6個字符(或數字),最多隻能有4個名字。

我想現在的問題是...

[0-9A-ZA-Z] {0,6} [〜] {0,1}正則表達式| [0-9A-ZA- Z] {0,6} [〜] {1} [0-9a-zA-Z] {0,4} [〜] {0,1}

但我想知道他們是否是更好的解決方案。

注:我應該進一步澄清......如果只有4個名字是允許的,那就意味着最多隻允許3個名字。代字符號表示位置,所以如果~~~ BOB發生,那將意味着位置1,2和3是空的,並且第四位被BOB佔用。另外,如果你有JOE ~~~,JOE處於第一位,其餘都是空的。零個或多個名稱可以位於4個位置中的任何位置。此外,允許使用諸如。,*,空格等符號。

+0

得到什麼'~~~','~~~一個B',或空字符串有效? – Qtax

回答

1

我認爲這是你在

^[^~]{0,6}(~[^~]{0,6}){0,3}$ 
+0

謝謝,這實際上解決了它。我的一位自稱是正則表達式專家的同事實際上已經在這個問題上擱置了好幾個小時,所以我非常感謝答案。 – WayneH

0

空字符串是否有效?那麼僅僅由波浪組成的字符串呢?如果是這樣,以下將起作用:

^([0-9a-zA-Z]{0,6}~?){0,4}$ 
+1

這會匹配超過6個字符的名字。 – Qtax

+0

〜JOE〜PETE〜SAM〜BOB也不合格 – Chriszuma

+0

啊,很好的電話。我的錯。我會離開這一點,因爲我的修復基本上是克里斯已經發布的。 – Asmor

1

這個怎麼樣?

^(~*\b[0-9a-zA-Z]{1,6}\b~*){0,4}$ 

假設有沒有限制之間,~年代以前和之後的名稱數量。

\b轉義序列匹配單詞之間的「邊界」 - 即任何字母數字和任何非字母數字字符之間的空格。

此外,專業提示:\w轉義序列匹配與[0-9a-zA-Z]相同的東西。上述正則表達式可以縮短爲:

^(~*\b\w{1,6}\b~*){0,4}$ 
相關問題