Khi d liu cn kim tra càng phc tp thì cú pháp ca biu thc chính quy cũng càng
phc tp. Ví d, d dàng kim tra d liu nhp ch cha s hay có chiu dài ti thiu,
nhưng kim tra mt URL khá phc tp. Bng 2.3 lit kê mt s biu thc chính quy dùng
để kim tra các kiu d liu thông dng.
Bng 2.3 Mt s biu thc chính quy thông dng
Kiu d liu nhp Mô t Biu thc chính quy
S Ch cha các ch s thp phân; ví
d 5, hoc 5683874674. ^\d+$
PIN Cha 4 ch s thp phân,
ví d 1234. ^\d{4}$
Mt khu đơn gin Cha t 6 đến 8 ký t; ví d ghtd6f
hoc b8c7hogh. ^\w{6,8}$
S th tín dng
Cha d liu phù hp vi cu trúc
ca hu hết các loi s th tín dng,
ví d 4921835221552042 hoc
4921-8352-2155-2042.
^\d{4}-?\d{4}-?\d{4}-
?\d{4}$
Địa ch e-mail
[\w-]+ nghĩa là cha mt
hoc nhiu ký t word
hoc du gch ngang, ví d
some-body@adatum.com
^[\w-]+@([\w- ]+\.)+[\w-
]+$
HTTP hoc HTTPS
URL
D liu là mt URL da-trên-HTTP
hay da-trên-HTTPS, ví d
http://www.microsoft.com
^https?://([\w- ]+\.)+[\w-
]+(/[\w- ./ ?%=]*)?$
Mt khi đã biết cú pháp ca biu thc chính quy, bn to mt đối tượng
System.Text.RegularExpression.Regex bng cách truyn cho phương thc khi dng ca
nó chui cha biu thc chính quy. Sau đó, gi phương thc IsMatch ca đối tượng
Regex và truyn chui cn kim tra, phương thc này tr v mt giá tr lun lý cho biết
chui có hp l không. Cú pháp ca biu thc chính quy s ch định Regex so trùng toàn
b chui hay ch so trùng mt phn ca chui (xem ^, \A, $, và \z trong bng 2.2)
Phương thc ValidateInput dưới đây minh ha cách kim tra chui nhp bng biu thc
chính quy:
public static bool ValidateInput(string regex, string input) {
// To đối tượng Regex da trên biu thc chính quy.
Regex r = new Regex(regex);
// Kim tra d liu nhp có trùng vi biu thc chính quy hay không.
return r.IsMatch(input);
}
Bn có th s dng đối tượng Regex để kim tra nhiu chui, nhưng không th thay đổi
biu thc chính quy được gn cho nó; bn phi to mt đối tượng Regex mi tương ng
vi mt cu trúc mi. Phương thc ValidateInput trên to ra mt đối tượng Regex mi
mi ln được gi, thay vào đó bn có th s dng phương thc tĩnh np chng IsMatch.
public static bool ValidateInput(string regex, string input) {
// Kim tra d liu nhp có trùng vi biu thc chính quy hay không.
return Regex.IsMatch(input, regex);
}
1.1 S dng biu thc chính quy đã được biên dch
V
V
Bn cn gim thiu các tác động lên hiu năng ca ng dng khi các biu thc
chính quy phc tp được s dng thường xuyên.
#
#
Khi khi to đối tượng System.Text.RegularExpressions.Regex, hãy truyn
thêm tùy chn Compiled thuc kiu lit kê System.Text.RegularExpressions.
RegexOptions để biên dch biu thc chính quy thành Microsoft Intermediate
Language (MSIL).
Theo mc định, khi bn to đối tượng Regex, mu biu thc chính quy do bn xác định
trong phương thc khi dng được biên dch thành mt dng trung gian (không phi
MSIL). Mi ln bn s dng đối tượng Regex, b thc thi phiên dch dng trung gian này
và áp dng nó để kim tra chui. Vi các biu thc chính quy phc tp được s dng
thường xuyên, vic phiên dch lp lp đi li có th gây tác động xu lên hiu năng ca
ng dng.
Khi tùy chn RegexOptions.Compiled được ch định, b thc thi s biên dch biu thc
chính quy thành MSIL. MSIL này đưc gi là mã just-in-time (JIT), được biên dch thành
mã máy nguyên sinh trong ln thc thi đầu tiên, ging như mã assembly thông thường.
Biu thc chính quy được biên dch cũng được s dng ging như đối tượng Regex, vic
biên dch ch giúp thc thi nhanh hơn.
Tuy nhiên, vic biên dch biu thc chính quy cũng có vài nhược đim. Trước tiên, trình
biên dch JIT phi làm vic nhiu hơn, dn đến chm quá trình biên dch, đặc bit khi to
biu thc chính quy được biên dch khi ng dng khi động. Th hai, biu thc chính
quy được biên dch vn tn ti trong b nh khi không còn được s dng na, nó không
b b thu gom rác (Garbage Collector) xóa đi như các biu thc chính quy thông thường.
Vùng nh b chiếm ch được gii phóng khi chương trình kết thúc, hoc khi bn gii
phóng min ng dng.
Dòng mã sau minh ha cách to mt đối tượng Regex được biên dch thành MSIL:
Regex reg = new Regex(@"[\w-]+@([\w-]+\.)+[\w-]+",
RegexOptions.Compiled);
Ngoài ra, phương thc tĩnh Regex.CompileToAssembly cho phép bn to mt biu thc
chính quy được biên dch và ghi nó vào mt assembly khác. Nghĩa là bn có th to mt
assembly cha các biu thc chính quy để s dng cho nhiu ng dng sau này. Để biên
dch mt biu thc chính quy và lưu nó vào mt assembly, thc hin các bước sau:
1. To mt mng System.Text.RegularExpressions.RegexCompilationInfo đủ ln để
cha các đối tượng RegexCompilationInfo, mi đối tượng ng vi mt biu thc
chính quy cn được biên dch.
1. To mt đối tượng RegexCompilationInfo cho mi biu thc chính quy và truyn
đối s cho phương thc khi dng để xác định các thuc tính ca biu thc chính
quy này. Các thuc tính thông dng là:
IsPublicgiá tr bool xác định lp biu thc chính quy được to ra có tm vc
là công khai hay không.
Namemt String xác định tên ca lp.
Namespacemt String xác định không gian tên ca lp.
Patternmt String xác định mu mà biu thc chính quy s so trùng (xem chi
tiết mc 2.5).
Optionsmt giá tr thuc kiu lit kê System.Text.RegularExpressions.
RegexOptions xác định các tùy chn cho biu thc chính quy.
2. To mt đối tượng System.Reflection.AssemblyName để xác định tên ca assembly
mà phương thc Regex.CompileToAssembly s to ra.
3. Gi phương thc Regex.CompileToAssembly, truyn các đối s là mng
RegexCompilationInfo và đối tượng AssemblyName.
Quá trình trên to ra mt assembly cha các khai báo lp cho tng biu thc chính quy
được biên dch, mi lp dn xut t Regex. Để s dng mt biu thc chính quy đã được
biên dch trong assembly, bn cn to đối tượng biu thc chính quy này và gi các
phương thc ca nó ging như khi to nó vi phương thc khi dng Regex bình thường.
Bn nh thêm tham chiếu ti assembly khi s dng các lp biu thc chính quy nm
trong nó.
Đon mã sau minh ha cách to mt assembly có tên là MyRegex.dll, cha hai biu thc
chính quy có tên là PinRegex và CreditCardRegex:
using System.Text.RegularExpressions;
using System.Reflection;
public class CompiledRegexExample {
public static void Main() {
// To mng cha các đối tượng RegexCompilationInfo.
RegexCompilationInfo[] regexInfo = new RegexCompilationInfo[2];
// To đối tượng RegexCompilationInfo cho PinRegex.
regexInfo[0] = new RegexCompilationInfo(@"^\d{4}$",
RegexOptions.Compiled, "PinRegex", "", true);
// To đối tượng RegexCompilationInfo cho CreditCardRegex.
regexInfo[1] = new RegexCompilationInfo(
@"^\d{4}-?\d{4}-?\d{4}-?\d{4}$",
RegexOptions.Compiled, "CreditCardRegex", "", true);
// To đối tượng AssemblyName để định nghĩa assembly.
AssemblyName assembly = new AssemblyName();
assembly.Name = "MyRegEx";
// To các biu thc chính quy được biên dch.
Regex.CompileToAssembly(regexInfo, assembly);
}
}
1.2 To ngày và gi t chui
V
V
Bn cn to mt th hin System.DateTime mô t gi, ngày được ch định
trong mt chui.
#
#
S dng phương thc Parse hoc ParseExact ca lp DateTime.
Có nhiu cách mô t ngày, gi; ví d 1st June 2004, 1/6/2004, 6/1/2004, 1-Jun-2004 cùng
ch mt ngày; 16:434:43 PM cùng ch mt gi. Lp DateTime cung cp phương thc
tĩnh Parse rt linh hot, cho phép to th hin DateTime t nhiu cách mô t khác nhau
trong chui.
Phương thc Parse rt mnh trong vic to đối tượng DateTime t mt chui cho trước.
Nó có th x lý mt chui ch cha mt phn thông tin hay cha thông tin sai, và thay thế
các giá tr thiếu bng các giá tr mc định. Ngày mc định là ngày hin ti, gi mc định
12:00:00 AM. Nếu sau mi c gng, Parse không th to đối tượng DateTime, nó s
ném ngoi l System.FormatException. Ví d sau minh ha tính linh hot ca Parse:
// 01/09/2004 12:00:00 AM
DateTime dt1 = DateTime.Parse("Sep 2004");
// 05/09/2004 02:15:33 PM
DateTime dt2 = DateTime.Parse("Sun 5 September 2004 14:15:33");
// 05/09/2004 12:00:00 AM
DateTime dt3 = DateTime.Parse("5,9,04");
// 05/09/2004 02:15:33 PM
DateTime dt4 = DateTime.Parse("5/9/2004 14:15:33");
// 07/10/2004 02:15:00 PM (gi s ngày hin ti là 07/10/2004)
DateTime dt5 = DateTime.Parse("2:15 PM");