73
Chương 2: Thao tác dữ liệu
Khi khởi tạo đối tượng
System.Text.RegularExpressions.Regex
, hãy truyền thêm
tùy chọn
Compiled
thuộc kiểu liệt kê
System.Text.RegularExpressions.
RegexOptions
để biên dịch biểu thức chính quy thành Microsoft Intermediate
Language (MSIL).
Theo mặc định, khi bạn tạo đối tượng
Regex
, mẫu biểu thức chính quy do bạn xác định trong
phương thức khởi dựng được biên dịch thành một dạng trung gian (không phải MSIL). Mỗi
lần bạn sử dụng đối tượng
Regex
, bộ thực thi phiên dịch dạng trung gian này và áp dụng nó để
kiểm tra chuỗi. Với các biểu thức chính quy phức tạp được sử dụng thường xuyên, việc phiên
dịch lặp lặp đi lại có thể gây tác động xấu lên hiệu năng của ứng dụng.
Khi tùy chọn
RegexOptions.Compiled
được chỉ định, bộ thực thi sẽ biên dịch biểu thức chính
quy thành MSIL. MSIL này được gọi là mã just-in-time (JIT), được biên dịch thành mã máy
nguyên sinh trong lần thực thi đầu tiên, giống như mã assembly thông thường. Biểu thức
chính quy được biên dịch cũng được sử dụng giống như đối tượng
Regex
, việc biên dịch chỉ
giúp thực thi nhanh hơn.
Tuy nhiên, việc biên dịch biểu thức chính quy cũng có vài nhược điểm. Trước tiên, trình biên
dịch JIT phải làm việc nhiều hơn, dẫn đến chậm quá trình biên dịch, đặc biệt khi tạo biểu thức
chính quy được biên dịch khi ứng dụng khởi động. Thứ hai, biểu thức chính quy được biên
dịch vẫn tồn tại trong bộ nhớ khi không còn được sử dụng nữa, nó không bị bộ thu gom rác
(Garbage Collector) xóa đi như các biểu thức chính quy thông thường. Vùng nhớ bị chiếm chỉ
được giải phóng khi chương trình kết thúc, hoặc khi bạn giải phóng miền ứng dụng.
Dòng mã sau minh họa cách tạo một đối tượng
Regex
được biên dịch thành MSIL:
Regex reg = new Regex(@"[\w-]+@([\w-]+\.)+[\w-]+",
RegexOptions.Compiled);
Ngoài ra, phương thức tĩnh
Regex.CompileToAssembly
cho phép bạn tạo một biểu thức chính
quy được biên dịch và ghi nó vào một assembly khác. Nghĩa là bạn có thể tạo một assembly
chứa các biểu thức chính quy để sử dụng cho nhiều ứng dụng sau này. Để biên dịch một biểu
thức chính quy và lưu nó vào một assembly, thực hiện các bước sau:
1. Tạo một mảng
System.Text.RegularExpressions.RegexCompilationInfo
đủ lớn để
chứa các đối tượng
RegexCompilationInfo
, mỗi đối tượng ứng với một biểu thức chính
quy cần được biên dịch.
2. Tạo một đối tượng
RegexCompilationInfo
cho mỗi biểu thức chính quy và truyền đối số
cho phương thức khởi dựng để xác định các thuộc tính của biểu thức chính quy này.
Các thuộc tính thông dụng là:
•
IsPublic
giá trị
bool
xác định lớp biểu thức chính quy được tạo ra có tầm vực
là công khai hay không.
•
Name
một
String
xác định tên của lớp.
•
Namespace
một
String
xác định không gian tên của lớp.
•
Pattern
một
String
xác định mẫu mà biểu thức chính quy sẽ so trùng (xem chi
tiết ở mục 2.5).
•
Options
một giá trị thuộc kiểu liệt kê
System.Text.RegularExpressions.
RegexOptions
xác định các tùy chọn cho biểu thức chính quy.