• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Liệt kê các mẫu tương thích

Các thủ thuật liên quan đến xử lý chuỗi và thời gian

Điều hành viên: tungcan5diop, QUANITGROBEST

neverland87
Guru
Guru
Bài viết: 490
Ngày tham gia: T.Bảy 26/05/2007 4:31 pm
Been thanked: 8 time

Liệt kê các mẫu tương thích

Gửi bàigửi bởi neverland87 » T.Hai 14/04/2008 10:04 am

Thủ thuật: Liệt kê các mẫu tương thích
Tác giả: neverland87
Mô tả: Thủ thuật Regular Expression


Vấn đề: Bạn cần tìm một hoặc nhiều chuỗi con tương ứng với một mẫu cụ thể bên trong một chuỗi, Bạn muốn có thể đưa ra mã tìm kiếm để trả về tất cả các chuỗi con đang thỏa mãn, hay chỉ các chuỗi con đang thoa vốn là duy nhất bên trong tập hợp tất cả các chuỗi đã thỏa mãn.

Giải pháp:
Tạo phương thức FindSubString thực thi một Regular Expression và thu nhận tất cả text đang tương thích. Phương thức này trả về hoặc là tất cả kết quả tương thích hay chỉ là các mẫu tương thích duy nhất; cách hoạt động này được điều khiển bởi tham số findAllUnique. Lưu ý: nếu tham số findAllUnique = true, các mẫu tương thích duy nhất trả về được sắp xếp theo thứ tự bảng chữ cái. Mã nguồn của nó như sau:

Mã: Chọn hết

  1. static Match[] FindSubString(string source, string matchPattern, bool findUnique)
  2.         {
  3.             SortedList uniqueMatches = new SortedList();
  4.             Match[] retArray = null;
  5.             Regex re = new Regex(matchPattern, RegexOptions.Multiline);
  6.             MatchCollection theMatches = re.Matches(source);
  7.             if (findUnique)
  8.             {
  9.                 for (int counter = 0; counter < theMatches.Count; counter++)
  10.                 {
  11.                     if (!uniqueMatches.Contains(theMatches[counter].Value))
  12.                     {
  13.                         uniqueMatches.Add(theMatches[counter].Value, theMatches[counter]);
  14.                     }
  15.                 }
  16.                 retArray = new Match[uniqueMatches.Count];
  17.                 uniqueMatches.Values.CopyTo(retArray, 0);
  18.             }
  19.             else
  20.             {
  21.                 retArray = new Match[theMatches.Count];
  22.                 theMatches.CopyTo(retArray, 0);
  23.             }
  24.             return retArray;
  25.         }


Ví dụ dưới đây tìm kiếm về bất kỳ thẻ nào trong tài liệu XML; nó thực hiện điều này bằng cách tìm một khối text vốn bắt đầu với ký tự '<' và kết thúc với ký tự '>'
Giả sử tài liệu employees.xml có nội dung như sau:

Mã: Chọn hết

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <!-- This is list of employees -->
  3. <employees>
  4.   <employee employeeid="1">
  5.     <firstname>Nancy</firstname>
  6.     <lastname>Davolio</lastname>
  7.     <homephone>(206) 555-9857</homephone>
  8.     <notes>
  9.       <![CDATA[includes a BA in psychology from Colorado State University in 1970. She also completed "The Art of the Cold Call." Nancy is a member of Toastmasters International.]]>
  10.   </notes>
  11.   </employee>
  12.   <employee employeeid="2">
  13.     <firstname>Andrew</firstname>
  14.     <lastname>Fuller</lastname>
  15.     <homephone>(206) 555-9482</homephone>
  16.     <notes>
  17.       <![CDATA[Andrew received his BTS commercial in 1974 and a Ph.D. in international marketing from the University of Dallas in 1981.  He is fluent in French and Italian and reads German. He joined the company as a sales representative, was promoted to sales manager in January 1992 and to vice president of sales in March 1993. Andrew is a member of the Sales Management Roundtable, the Seattle Chamber of Commerce, and the Pacific Rim Importers Association.]]>
  18.     </notes>
  19.   </employee>
  20.   <employee employeeid="3">
  21.     <firstname>Janet</firstname>
  22.     <lastname>Leverling</lastname>
  23.     <homephone>(206) 555-3412</homephone>
  24.     <notes>
  25.       <![CDATA[Janet has a BS degree in chemistry from Boston College (1984). She has also completed a certificate program in food retailing management.  Janet was hired as a sales associate in 1991 and promoted to sales representative in February 1992.]]>
  26.     </notes>
  27.   </employee>
  28. </employees>


Mã: Chọn hết

  1. static void Main(string[] args)
  2.         {
  3.             string matchPattern = "<.*>";
  4.             XmlDocument doc = new XmlDocument();
  5.             doc.PreserveWhitespace = true;
  6.             doc.Load("D:\\employees.xml");
  7.             string source = doc.DocumentElement.InnerXml;
  8.             Console.WriteLine("UNIQUE MATCHES:");
  9.             Match[] x1 = FindSubString(source, matchPattern, true);
  10.             foreach (Match m in x1)
  11.             {
  12.                 Console.WriteLine(m.Value);
  13.             }
  14.             Console.WriteLine("\n\nALL MATCHES:");
  15.             Match[] x2 = FindSubString(source, matchPattern, false);
  16.             foreach (Match m in x2)
  17.             {
  18.                 Console.WriteLine(m.Value);
  19.             }
  20.         }


Kết quả cuối cùng cho ra:

Mã: Chọn hết

  1. UNIQUE MATCHES:
  2. <![CDATA[Andrew received his BTS commercial in 1974 and a Ph.D. in international
  3.  marketing from the University of Dallas in 1981.  He is fluent in French and It
  4. alian and reads German. He joined the company as a sales representative, was pro
  5. moted to sales manager in January 1992 and to vice president of sales in March 1
  6. 993. Andrew is a member of the Sales Management Roundtable, the Seattle Chamber
  7. of Commerce, and the Pacific Rim Importers Association.]]>
  8. <![CDATA[includes a BA in psychology from Colorado State University in 1970. She
  9.  also completed "The Art of the Cold Call." Nancy is a member of Toastmasters In
  10. ternational.]]>
  11. <![CDATA[Janet has a BS degree in chemistry from Boston College (1984). She has
  12. also completed a certificate program in food retailing management.  Janet was hi
  13. red as a sales associate in 1991 and promoted to sales representative in Februar
  14. y 1992.]]>
  15. </employee>
  16. </notes>
  17. <employee employeeid="1">
  18. <employee employeeid="2">
  19. <employee employeeid="3">
  20. <firstname>Andrew</firstname>
  21. <firstname>Janet</firstname>
  22. <firstname>Nancy</firstname>
  23. <homephone>(206) 555-3412</homephone>
  24. <homephone>(206) 555-9482</homephone>
  25. <homephone>(206) 555-9857</homephone>
  26. <lastname>Davolio</lastname>
  27. <lastname>Fuller</lastname>
  28. <lastname>Leverling</lastname>
  29. <notes>
  30.  
  31.  
  32. ALL MATCHES:
  33. <employee employeeid="1">
  34. <firstname>Nancy</firstname>
  35. <lastname>Davolio</lastname>
  36. <homephone>(206) 555-9857</homephone>
  37. <notes>
  38. <![CDATA[includes a BA in psychology from Colorado State University in 1970. She
  39.  also completed "The Art of the Cold Call." Nancy is a member of Toastmasters In
  40. ternational.]]>
  41. </notes>
  42. </employee>
  43. <employee employeeid="2">
  44. <firstname>Andrew</firstname>
  45. <lastname>Fuller</lastname>
  46. <homephone>(206) 555-9482</homephone>
  47. <notes>
  48. <![CDATA[Andrew received his BTS commercial in 1974 and a Ph.D. in international
  49.  marketing from the University of Dallas in 1981.  He is fluent in French and It
  50. alian and reads German. He joined the company as a sales representative, was pro
  51. moted to sales manager in January 1992 and to vice president of sales in March 1
  52. 993. Andrew is a member of the Sales Management Roundtable, the Seattle Chamber
  53. of Commerce, and the Pacific Rim Importers Association.]]>
  54. </notes>
  55. </employee>
  56. <employee employeeid="3">
  57. <firstname>Janet</firstname>
  58. <lastname>Leverling</lastname>
  59. <homephone>(206) 555-3412</homephone>
  60. <notes>
  61. <![CDATA[Janet has a BS degree in chemistry from Boston College (1984). She has
  62. also completed a certificate program in food retailing management.  Janet was hi
  63. red as a sales associate in 1991 and promoted to sales representative in Februar
  64. y 1992.]]>
  65. </notes>
  66. </employee>
  67.  


Chú ý rằng, nếu ta có 2 thẻ trên cùng một dòng như dưới đây:
<tagData></tagData>
thì RE sẽ đón bắt toàn bộ dòng, chứ không chỉ riêng lẻ từng thẻ. Bạn có thể thay đổi RE từ <.*> sang <[^>*> chỉ để so khớp tùy vào thẻ đóng >
(([^>]* tương thích với mọi thứ vốn không phải là một >)


SIMPLY THE BEST - ĐƠN GIẢN LÀ TỐT NHẤT

Quay về “[.NET] Chuỗi và Thời gian”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách