Thứ Tư, 27 tháng 2, 2013

So khớp với ký tự bất kỳ và tính luôn cả ký tự xuống dòng \n trong Regex C#

Sử dụng RegexOptions.Singleline

Mình muốn lấy giá trị nằm trong 2 đoạn <tag> và </tag>

string value = Regex.Match("<tag>av</tag>", @"<tag>(.*?)</tag>").Groups[1].Value;

Kết quả: value = 'av'

Đoạn code trên sẽ chạy ok nếu giá trị nằm trong <tag> và </tag> không có ký tự \n. Vì (.*?) chỉ khớp với các ký tự bất kỳ trừ ký tự \n.

string value = Regex.Match("<tag>av\n</tag>", @"<tag>(.*?)</tag>").Groups[1].Value;

Kết quả : value =''

Sử dụng option: RegexOptions.Singleline sẽ làm cách dùng ký tự  dot (.) tính luôn cả giá trị \n.

Specifies single-line mode. Changes the meaning of the dot (.) so it matches every character (instead of every character except \n).

string value = Regex.Match("<tag>av\n</tag>", @"<tag>(.*?)</tag>", RegexOptions.Singleline).Groups[1].Value;

Kết quả: value= 'av\n'

Thứ Sáu, 1 tháng 2, 2013

Các ký tự dùng trong Regex

Các ký tự dùng trong Regex:

. : đại diện cho 1 ký tự bất kỳ trừ ký tự xuống dòng \n.
\d : ký tự chữ số tương đương [0-9]
\D : ký tự ko phải chữ số
\s : ký tự khoảng trắng tương đương [ \f\n\r\t\v]
\S : ký tự không phải khoảng trắng tương đương [ ^\f\n\r\t\v]
\w : ký tự word (gồm chữ cái và chữ số, dấu gạch dưới _ ) tương đương [a-zA-Z_0-9]
\W : ký tự không phải ký tự word tương đương [^a-zA-Z_0-9]
^ : bắt đầu 1 chuỗi hay 1 dòng
$ : kết thúc 1 chuỗi hay 1 dòng
\A : bắt đầu 1 chuỗi
\z : kết thúc 1 chuỗi
| : ký tự ngăn cách so trùng tương đương với phép or (lưu ý cái này nếu muốn kết hợp nhiều điều kiện)
[abc] : khớp với 1 ký tự nằm trong nhóm là a hay b hay c.
[a-z] so trùng với 1 ký tự nằm trong phạm vi a-z, dùng dấu - làm dấu ngăn cách.
[^abc] sẽ không so trùng với 1 ký tự nằm trong nhóm, ví dụ không so trùng với a hay b hay c.
() : Xác định 1 group (biểu thức con) xem như nó là một yếu tố đơn lẻ trong pattern .ví dụ ((a(b))c) sẽ khớp với b, ab, abc.
? : khớp với đứng trước từ 0 hay 1 lần. Ví dụ A?B sẽ khớp với B hay AB.
* : khớp với đứng trước từ 0 lần trở lên . A*B khớp với B, AB, AAB
+ : khớp với đứng trước từ 1 lần trở lên. A+B khớp với AB, AAB.
{n} : n là con số, Khớp đúng với n ký tự đúng trước nó . Ví dụ A{2}) khớp đúng với 2 chữ A.
{n, } : khớp đúng với n ký tự trở lên đứng trước nó , A{2,} khớp vói AA, AAA ...
{m,n} : khớp đùng với từ m->n ký tự đứng trước nó, A{2,4} khớp vói AA,AAA,AAAA.

Thứ Tư, 9 tháng 1, 2013

Tạo Unique Index có điều kiện (where ) trong MS SQL Server

Sử dụng bằng lệnh:
  1. CREATE UNIQUE INDEX RecordNotDuplicate ON dbo.tblRecord(DomainID,RecordType,RecordName)  
  2. WHERE (RecordType != 3) and RecordStatus =1  
  3.   
  4. CREATE UNIQUE INDEX MXRecordNotDuplicate ON dbo.tblRecord(DomainID,RecordType,RecordName,Priority)  
  5. WHERE RecordType = 3 and RecordStatus =1  
  6.       
Sử dụng chế độ Design: Tạo index bình thường, phần Filter điền điều kiện filter vào:


Thứ Năm, 3 tháng 1, 2013

Thứ Năm, 20 tháng 12, 2012

Tìm danh sách các Store Procedure,View có liên quan đến Table nào đó trong MS SQL Server

Hôm nay mình cấu trúc lại database nên cần chỉnh sửa 1 số tên cột, xóa 1 số bảng không còn dùng nữa ra khỏi database.

Một điều khá mệt là hệ thống mình kết nối dữ liệu tới database đều sử dụng Store Proc hết, số lượng store proc rất nhiều. Khi sửa tên cột trong table, các store proc nào có gọi đến tên cột của table nó không tự động đổi cho nên khi gọi store proc này sẽ báo lỗi. Thêm 1 điều nữa là khi quyết định xóa 1 table mình phải chắc chắn không có store proc hay view nào đang dùng tới nó.

Sử dụng đoạn lệnh sau để tìm các store proc, view có sử dụng table muốn sửa hay muốn xóa:
  1. use [Database Name]  
  2. SELECT DISTINCT o.name, o.xtype  
  3. FROM syscomments c  
  4. INNER JOIN sysobjects o ON c.id=o.id  
  5. WHERE c.TEXT LIKE '%tableName%'      
Hoặc
SELECT o.name, o.xtype, m.definition
FROM sys.sql_modules  m  
INNER JOIN sysobjects o ON m.object_id = o.id 
WHERE m.definition LIKE '%tableName%' 
Cách làm này có thể không chính xác tuyệt đối (tìm trong nội dung có chứa tên của table) nhưng cũng khá hiệu quả.

Thứ Hai, 10 tháng 12, 2012

Xóa các thẻ Html ra khỏi 1 chuỗi (lấy InnerText của 1 thẻ Html)

Khi có 1 object HtmlElement (System.Windows.Forms) hay HtmlNode (HtmlAgilityPack) thì việc lấy InnerText của nó khá đơn giản, chỉ cần .InnerText là ra.

Trường hợp có 1 thẻ Html nhưng ở dạng chuỗi thì sử dụng regular expression để replace những đoạn có cấu trúc là 1 tag mở hay tag đóng của 1 thẻ Html.

Có rất nhiều mẫu để tìm tag html ví dụ "<[^>]*>" hoặc "<.*?>" . Trường hợp này mình dùng mẫu  "<[^>]*>":
  1. public static string RemoveHtml(this string text)  
  2. {  
  3.     return Regex.Replace(text, "<[^>]*>"string.Empty);  
  4. }  
Test:
  1. string link = "<a href=\"http://www.hanhtranglaptrinh.com/2012/11/goi-ham-javascript-bang-webbrowser.html\">Gọi hàm Javascript bằng webbrowser control C#</a>";  
  2. string anchorText = link.RemoveHtml();//Gọi hàm Javascript bằng webbrowser control C#