2016-04-26 32 views
0

我需要滿足一個要求,只接受MM/DD/YYYY形式的值。如何在XSD架構中正確轉義正則表達式模式?

從我讀過關於:https://www.w3.org/TR/xmlschema11-2/#nt-dateRep 使用

<xs:simpleType name="DATE"> 
     <xs:restriction base="xs:date"/> 
    </xs:simpleType> 

是行不通的爲正則表達式顯然是不支持這種格式。

我發現和調整,這種格式:

^(?:(?:(?:0?[13578]|1[02])(\/)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:0?2(\/)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:(?:0?[1-9])|(?:1[0-2]))(\/)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$ 

這種形式:

\^\(\?:\(\?:\(\?:0\?\[13578\]\|1\[02\]\)\(\\/\)31\)\1\|\(\?:\(\?:0\?\[1,3-9\]\|1\[0-2\]\)\(\\/\)\(\?:29\|30\)\2\)\)\(\?:\(\?:1\[6-9\]\|\[2-9\]\d\)\?\d{2}\)$\|\^\(\?:0\?2\(\\/\)29\3\(\?:\(\?:\(\?:1\[6-9\]\|\[2-9\]\d\)\?\(\?:0\[48\]\|\[2468\]\[048\]\|\[13579\]\[26\]\)\|\(\?:\(\?:16\|\[2468\]\[048\]\|\[3579\]\[26\]\)00\)\)\)\)$\|\^\(\?:\(\?:0\?\[1-9\]\)\|\(\?:1\[0-2\]\)\)\(\\/\)\(\?:0\?\[1-9\]\|1\d\|2\[0-8\]\)\4\(\?:\(\?:1\[6-9\]\|\[2-9\]\d\)\?\d{2}\)$ 

現在我不再獲得無效的轉義XML編輯器錯誤(使用XML間諜),但我得到這一個:

invalid-escape: The given character escape is not recognized. 

我已經根據這裏的XML模式規範做了轉義: https://www.w3.org/TR/xmlschema-2/#regexs F.1.1節有一個轉義表。

任何人都可以請幫助指出這個權利?

謝謝!

+0

XSD正則表達式不知道'^'和'$',我猜你不需要轉義'/'。嘗試'(?:(?:(?:(?: 0?[13578] | 1 [02])(/)31)\ 1 |(?:(?: 0?[13-9] | 1 [0 -2])(/)(?: 29 | 30)\ 2))(:(?: 1 [6-9] | [2-9] \ d)\ d {2})|?(?: ?0 2(/)29 \ 3(:(:(?: 1 [6-9] |?[2-9] \ d)(?:0 [48] | [2468] [048] | [ 13579] [26])|(:(?: 16 |?[2468] [048] | [3579] [26])00))))|(:(?: 0 [1-9])?| ?(?:1 [0-2]))(/)(?: 0 [1-9] | 1 \ d | 2 [0-8])\ 4(:(?: 1 [6-9] | [2-9] \ d)?\ d {2}))' –

+0

不工作,它給了我這個錯誤:unexpected-metaChar:元字符「。」,「\」,「?」,「*」 「+」,「{」,「}」,「(」,「)」,「|」,「[」和「]」不能在此位置不轉義。 – Carmageddon

+0

請注意,我在原始問題中提出的轉義形式給了我一個不同的錯誤:invalid-escape:給定的字符轉義不被識別。這可能表明我需要以某種方式定義轉義字符在什麼地方。 – Carmageddon

回答

1

如果檢查XSD正則表達式語法resources,你會發現,有是non-capturing groups(?:...)),也不backreferences不支持(\n像實體指(...)與捕獲組捕獲文本)。

由於唯一的分隔符是/,因此可以完全清除反向引用。

使用

((((0?[13578]|1[02])/31)/|((0?[13-9]|1[0-2])/(29|30)/))((1[6-9]|[2-9]\d)?\d{2}‌​)|(0?2/29/(((1[6-9]|[2-9]\d)?(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[35‌​79][26])00))))|(0?[1-9]|1[0-2])/(0?[1-9]|1\d|2[0-8])/(1[6-9]|[2-9]\d)?\d{2}) 

this regex demo

注意,ACC。到regular-expressions.info

Particularly noteworthy is the complete absence of anchors like the caret and dollar, word boundaries, and lookaround. XML schema always implicitly anchors the entire regular expression. The regex must match the whole element for the element to be considered valid.

所以,你不應該使用^在XSD正則表達式(字符串的開始)和$(字符串的結束)。

/符號被轉義在正則表達式的口味,其中它是一個正則表達式定界符,並且在XSD正則表達式,沒有正則表達式的分隔符(作爲唯一的作用是匹配,並且不存在改性劑:XML schemas do not provide a way to specify matching modes) 。因此,在XSD正則表達式中不能逃避/

測試AT在線測試儀注:

如果測試在regex101.com或類似的網站,請注意,在大多數情況下,你需要躲避/如果它被選中作爲一個正則表達式分隔符。完成測試後,您可以安全地在/之前刪除\

1

OK,所以你從這個開始(我要插入的可讀性換行):

^(?:(?:(?:0?[13578]|1[02])(\/)31)\1|(?:(?:0?[1,3-9]|1[0-2])(\/) 
(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$ 
|^(?:0?2(\/)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$| 
^(?:(?:0?[1-9])|(?:1[0-2]))(\/)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$ 

可怕的東西。現在,在XSD中:

(a)沒有^$錨,它們不是必需的(模式被隱式錨定)。所以把它們拿出來。你的回覆是:\^\$,但這沒有意義:你實際上並不想在你的輸入中使用旋律和美元符號。

(b)XSD不識別非捕獲組(?:xxxx)。只需將它們替換爲捕獲組即可,即刪除?:再次,您已經擺脫了問號,這根本沒有任何意義。

(三)\d大概應該是[0-9],除非你真的想匹配的非ASCII數字(如泰國或東部阿拉伯數字)

(d)斜槓(/)並不需要進行轉義,而且確實無法逃脫。所以用/代替\/。 (e)我看到一些反向參考文獻,\1,\2,\4。 XSD正則表達式不允許反向引用。但據我所知,這個正則表達式中的反向引用沒有任何用處。他們中的大多數似乎是對(\/)這種形式的組的返回引用,它們只能匹配一個斜槓,所以後引用\1可以簡單地替換爲/。也許他們是迴歸到一些早期的正則表達式,它允許使用其他分隔符,但要求它們保持一致。

從你試圖解決這裏的問題,在我看來,你對正則表達式沒有很透徹的理解。我擔心要做到這一點,你必須咬緊牙關,學習它是如何工作的;調試複雜的正則表達式很困難,而且您不會通過反覆試驗來正確地使用它。