ตรวจสอบข้อ จำกัด ในการบังคับใช้ ###. ###. #### จับคู่รูปแบบ


11

ฉันต้องการตรวจสอบข้อ จำกัด ที่บังคับใช้รูปแบบ regex นี้สำหรับรหัสหลายส่วน:

^\d{3}\.\d{3}\.\d{4}$

... สามตัวเลข, จุด, สามตัวเลข, จุด, สี่ตัวเลข

ฉันต้องสร้างฟังก์ชัน CLR เพื่อบังคับใช้การจับคู่รูปแบบหรือไม่และสามารถอ้างอิงฟังก์ชัน CLR ใน DDL ได้หรือไม่

มีวิธีในการบังคับใช้รูปแบบในอีกทางหนึ่งโดยใช้LIKEหรือไม่

คำตอบ:


16

regex ในคำถามของคุณไม่ได้คลุมเครือทั้งหมด

ในรสชาติส่วนใหญ่ที่รองรับ Unicode \ d รวมตัวเลขทั้งหมดจากสคริปต์ทั้งหมด ข้อยกเว้นที่น่าสังเกตคือ Java, JavaScript และ PCRE รสชาติของ Unicode เหล่านี้ตรงกับหลัก ASCII ที่มี \ d

ดังนั้นในหลาย ๆ รสชาติมันจะจับคู่١١١.١١١.١١١١(ตัวละครนั้นเป็นอารบิกดิคดิจิตัลวัน )

0-9ฉันสมมติว่าคุณเพียงต้องการให้ตรงกับภาษาละติน คุณสามารถใช้ได้

DECLARE  @T TABLE
(
Col CHAR(12) CHECK (
                   Col LIKE REPLACE('ddd.ddd.dddd','d','[0-9]') 
                                  COLLATE Latin1_General_100_BIN2
                   )
)

ฉันกำลังใช้อนุประโยคไบนารีเรียงดังนั้นสตริงที่ชอบ¾¾¾.¾¾¾.¾¾¾¾หรือ10².10².1000ไม่ผ่านการตรวจสอบ ( ที่สามารถเกิดขึ้นได้ในการเปรียบเทียบบางส่วน )

สิ่งเหล่านี้จะไม่ตรงกับ CLR regex ที่ต้องการและถึงแม้ว่าการใช้ set syntax ( [0123456789]) แทนที่จะเป็นช่วงของไวยากรณ์ ( [0-9]) จะแก้ไขค่าแรก แต่ก็ยังคงอยู่ในการเรียงขึ้นอยู่กับว่า2ตรงกัน²หรือไม่

ฉันใช้REPLACEมากกว่าการเข้ารหัสLIKEรูปแบบยากเพราะฉันคิดว่ามันอ่านง่ายกว่าสิ่งที่รูปแบบการตรวจสอบ [0-9][0-9][0-9].[0-9] [0-9][0-9].[0-9][0-9][0-9][0-9]มันเป็นเรื่องง่ายที่จะเห็นตัวเลขสามหลักและจุดตามด้วยตัวเลขสามหลักอีกจุดแล้วตัวเลขสี่หลักในรูปแบบที่มากกว่าการแยก

นอกจากนี้ยังทำให้สลับการใช้งานได้ง่ายขึ้น

ฉันตัดสินใจว่าคุณต้องการซีแมนทิกส์ที่พัดเต็มของนิพจน์ปกติ CLR หลังจากทั้งหมดคุณสามารถเปลี่ยน'[0-9]'ด้านบนเป็นด้านล่าง (และอาจเปลี่ยนคอลัมน์เป็นNCHAR(12)ในกรณีนั้น)

'[' +
 /*48-57 Basic Latin*/
N'0-9'+
 /*1632-1641 Arabic-Indic*/
N'٠-٩'+
 /*1776-1785 Extended Arabic-Indic*/
N'۰-۹'+
 /*1984-1993 Nko*/
N'߀-߉'+
 /*2406-2415 Devanagari*/
N'०-९'+
 /*2534-2543 Bengali*/
N'০-৯'+
 /*2662-2671 Gurmukhi*/
N'੦-੯'+
 /*2790-2799 Gujarati*/
N'૦-૯'+
 /*2918-2927 Oriya*/
N'୦-୯'+
 /*3046-3055 Tamil*/
N'௦-௯'+
 /*3174-3183 Telugu*/
N'౦-౯'+
 /*3302-3311 Kannada*/
N'೦-೯'+
 /*3430-3439 Malayalam*/
N'൦-൯'+
 /*3558-3567 Sinhala*/
N'෦-෯'+
 /*3664-3673 Thai*/
N'๐-๙'+
 /*3792-3801 Lao*/
N'໐-໙'+
 /*3872-3881 Tibetan*/
N'༠-༩'+
 /*4160-4169 Myanmar*/
N'၀-၉'+
 /*4240-4249 Myanmar Shan*/
N'႐-႙'+
 /*6112-6121 Khmer*/
N'០-៩'+
 /*6160-6169 Mongolian*/
N'᠐-᠙'+
 /*6470-6479 Limbu*/
N'᥆-᥏'+
 /*6608-6617 New Tai Lue*/
N'᧐-᧙'+
 /*6784-6793 Tai Tham Hora*/
N'᪀-᪉'+
 /*6800-6809 Tai Tham Tham*/
N'᪐-᪙'+
 /*6992-7001 Balinese*/
N'᭐-᭙'+
 /*7088-7097 Sundanese*/
N'᮰-᮹'+
 /*7232-7241 Lepcha*/
N'᱀-᱉'+
 /*7248-7257 Ol Chiki*/
N'᱐-᱙'+
 /*42528-42537 Vai*/
N'꘠-꘩'+
 /*43216-43225 Saurashtra*/
N'꣐-꣙'+
 /*43264-43273 Kayah Li*/
N'꤀-꤉'+
 /*43472-43481 Javanese*/
N'꧐-꧙'+
 /*43504-43513 Myanmar Tai Laing*/
N'꧰-꧹'+
 /*43600-43609 Cham*/
N'꩐-꩙'+
 /*44016-44025 Meetei Mayek*/
N'꯰-꯹'+
 /*65296-65305 Fullwidth*/
N'0-9'+
N']'  COLLATE Latin1_General_100_BIN2
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.