PERIKSA kendala untuk memberlakukan kecocokan pola ###. ###. ####

11

Saya ingin memiliki batasan periksa yang memberlakukan pola regex ini untuk kode multi-bagian:

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

... tiga angka, satu periode, tiga angka, satu periode, empat angka.

Apakah saya perlu membuat fungsi CLR untuk menegakkan pencocokan pola, dan bisakah fungsi CLR direferensikan dalam DDL?

Apakah ada cara untuk menegakkan pola dengan cara lain, menggunakan LIKE?

mrblint
sumber

Jawaban:

16

Regex dalam pertanyaan Anda tidak sepenuhnya ambigu

Dalam sebagian besar rasa yang mendukung Unicode, \ d mencakup semua digit dari semua skrip. Pengecualian penting adalah Java, JavaScript, dan PCRE. Citarasa Unicode ini hanya cocok dengan angka ASCII dengan \ d.

Jadi dalam banyak rasa itu akan cocok ١١١.١١١.١١١١(karakter itu menjadi Arab-Indic Digit One )

Saya berasumsi bahwa Anda hanya ingin mencocokkan bahasa latin 0-9. Kamu bisa menggunakan

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

Saya menggunakan klausa susun biner sehingga string suka ¾¾¾.¾¾¾.¾¾¾¾atau 10².10².1000tidak lulus pemeriksaan ( seperti yang bisa terjadi pada beberapa pemeriksaan ).

Tidak satu pun dari ini akan cocok dengan regex CLR yang diinginkan dan meskipun menggunakan sintaks set ( [0123456789]) daripada sintaks rentang ( [0-9]) menyelesaikan yang pertama masih tergantung pada apakah 2cocok ²atau tidak.

Saya menggunakan REPLACEdaripada mengkodekan LIKEpola karena saya merasa lebih mudah dibaca apa pola memeriksa. Lebih mudah untuk melihat tiga digit dan satu titik diikuti oleh tiga digit lagi dari titik kemudian empat digit dalam format itu daripada parsing [0-9][0-9][0-9].[0-9] [0-9][0-9].[0-9][0-9][0-9][0-9].

Ini juga memudahkan untuk menukar implementasi.

Saya Anda memutuskan bahwa Anda ingin semantik penuh ekspresi reguler CLR setelah semua Anda hanya dapat mengubah di '[0-9]'atas ke bawah (dan kemungkinan mengubah kolom NCHAR(12)dalam hal itu)

'[' +
 /*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
Martin Smith
sumber