Thay thế thẻ html regex

Chuỗi ngày lưu vào CSDL rất đa dạng. Rất khó để sử dụng hàm DateTime. TryPude() to auto convert a string to Datetime ngon lành cành đào

Show

Thay thế thẻ html regex

Tìm kiếm một chuỗi, lưu chuỗi đó lại và lấy chuỗi đã lưu để chèn vào vị trí nào đó

Hay nói cách khác, ta cần thay một chuỗi bằng một chuỗi khác, trong chuỗi mới đó lại chứa cả chuỗi vừa được thay thế. Như ví dụ dưới đây sẽ cho các bạn thấy. Ta cần tìm ra ClassName, nhưng không được thay thế ClassName đó bằng Class khác mà ta sẽ ghép nó vào 2 vị trí thay vì chỉ có 1 vị trí như hiện tại

Thay thế thẻ html regex

Thay thế thẻ html regex

Vì vậy RegEx có thể giúp gì cho chúng ta trong các trường hợp trên?

Thay thế thẻ html regex

Biểu thức chính quy sinh ra là để giúp cuộc đời bạn bớt khổ. Hãy tưởng tượng bạn phải nai lưng ra sao chép-dán bao nhiêu mã. Bạn hoàn toàn có thể tải các công cụ về để thay thế giúp bạn. Nhưng bạn cần bao nhiêu công cụ cho đủ đây

Thay vào đó, bạn hãy thử học RegEx. Bộ cú pháp này sẽ giúp bạn thao tác với chuỗi như dao chém chuối. Như ta thấy các ví dụ bên trên, tất cả đều là chuỗi

^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$
8 ví dụ
^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$
9 hoặc chuỗi
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
0. RegEx là ngôn ngữ giúp xử lý chuỗi rất mạnh

RegEx không phải là ngôn ngữ lập trình. Nó chỉ là một

31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
1 dùng để bắt chuỗi. Nhưng nó cực kỳ phổ biến và bất kỳ ngôn ngữ lập trình nào cũng hỗ trợ. Nó có cả phần thưởng ứng dụng và công cụ ăn theo

Hãy lần lượt xem qua các ví dụ sau đây để học cách sử dụng Biểu thức chính quy nhé!

Bắt đầu sử dụng Biểu thức chính quy

Để bắt đầu sử dụng và học cách sử dụng RegEx, mình hay sử dụng trang web https. //regex101. com/. Giao diện như sau

Thay thế thẻ html regex

Trước hết các bạn hãy đọc qua một trong các quy tắc bắt chuỗi (khớp) đơn giản nhất của RegEx

  • 31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    2 Tìm và so sánh tất cả các ký tự nằm trong dấu ngoặc và trùng khớp với 1 ký tự trong dấu ngoặc. Ví dụ.
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    3 sẽ trùng khớp với 3 hoặc 1,
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    4 sẽ trùng khớp với bất kỳ ký tự nào trong khoảng từ 0 đến 9
  • 31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    5 So sánh và trùng khớp với
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    6 ký tự nằm trong khoảng chỉ định. Ví dụ.
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    5 sẽ khớp với một ký tự trong khoảng từ a đến z nằm trong chuỗi cần kiểm tra.
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    8 sẽ khớp với bất kỳ ký tự nào trong khoảng từ 0 đến 9
  • 31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    9 So sánh và không trùng khớp với các ký tự nằm trong khoảng chỉ định. Dấu
    ^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$
    
    20 (dấu đóng) nằm trong dấu ngoặc nhọn là dấu phủ định. Ví dụ.
    ^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$
    
    21 sẽ không trùng khớp với tất cả các ký tự nằm trong khoảng từ a đến z
  • ^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$
    
    20 Khớp với phần đầu của chuỗi đích. Ví dụ.
    ^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$
    
    23 sẽ trùng khớp với chữ a trong chuỗi abc,
    ^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$
    
    24 sẽ trùng khớp với chữ đầu tiên – chữ "the" của chuỗi "The quick brown fox jumps over the lazy dog"
  • ^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$
    
    25 Khớp với phần cuối của chuỗi đích. Ví dụ.
    ^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$
    
    26 sẽ trùng khớp với chữ c trong chuỗi abc,
    ^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$
    
    27 sẽ trùng khớp với chữ cuối – chữ "dog" của chuỗi "The quick brown fox jumps over the lazy dog"
  • ^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$
    
    28 Trùng khớp với 1 hoặc nhiều lần ký tự đứng trước nó. Ví dụ
    ^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$
    
    29 sẽ chỉ trùng với chuỗi có từ 1 con số trở lên
  • 31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    20 Trùng khớp với 0 hoặc nhiều ký tự đứng trước nó. Ví dụ
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    21 sẽ trùng với chuỗi có chứa 1 chữ số hoặc k có chữ số nào cũng đc
  • 31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    22 Trùng khớp với 0 hoặc 1 lần các ký tự đứng trước nó. Tương tự như
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    20 nhưng nó lại chỉ nhân lên 1 lần.
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    20 thì nhân lên nhiều lần
  • 31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    25 Trùng khớp với 1 ký tự đơn bất kỳ ngoại trừ ký tự ngắt dòng (ngắt dòng) và cũng không lấy được ký tự có dấu (unicode). Ví dụ.
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    25 sẽ khớp với ký tự a hoặc b hoặc c trong chuỗi abc. Nhưng
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    25 sẽ không bắt được các chữ
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    28 hoặc
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    29
  • 31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    20 Trùng khớp đúng với n lần ký tự đứng trước nó. n is an number of sound. Ví dụ
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    21 sẽ bắt được các số có 2 chữ số liền kề nhau
  • 31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    22 Trùng khớp với ít nhất n lần ký tự đứng trước nó. n is an number of sound. Ví dụ
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    23 sẽ bắt được các số có từ 2 chữ số trở lên đứng liền nhau
  • 31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    24 Trùng khớp với ít nhất n lần và nhiều nhất là m lần ký tự đứng trước nó. n and m is a number of sound and n <= m. Ví dụ.
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    25 sẽ khớp với hah, haah, haaah nhưng không khớp với haaaah
  • 31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    26 Trùng khớp với x hoặc y. Ví dụ.
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    27 sẽ khớp với chữ chậm hoặc nhanh trong chuỗi đích
  • 31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    28 Trùng khớp với toàn bộ ký tự đứng trước nó. Ví dụ.
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    29 sẽ khớp với toàn bộ từ hello trong chuỗi hello world nhưng sẽ không khớp với chuỗi helloworld
  • 31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    20 Ngược lại với
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    28,
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    20 sẽ không khớp với toàn bộ mà chỉ có 1 phần ký tự đứng trước nó. Ví dụ.
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    23 sẽ khớp với chữ hello trong chuỗi helloworld nhưng sẽ không khớp với chuỗi hello world
  • 31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    24 Trùng khớp 1 ký tự số (chữ số)
  • 31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    25 Matching 1ký tự không phải số (không phải chữ số)
  • 31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    26 Trùng khớp 1 ký tự khoảng trắng (khoảng trắng) bao gồm khoảng trắng được tạo bởi các phím Tab
  • 31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    27 Trùng khớp với 1 ký tự không phải là khoảng trắng (không phải khoảng trắng)
  • 31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    28 Trùng khớp với các ký tự là từ (từ) bao gồm dấu
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    29 (gạch dưới) và chữ số
  • 31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    200 Trùng khớp với các ký tự không phải là từ (không phải từ). Ví dụ.
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    200 sẽ khớp với ký tự
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    202 trong chuỗi "100%"
  • 31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    203 Trùng khớp với 1 ký tự unicode. Ví dụ. ________ 5204 sẽ khớp với ký tự "ú", ________ 5205 sẽ khớp với ký tự "ù"
  • 31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    206 Trùng khớp với
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    207 Unicode bất kỳ ngoại trừ dấu cách. Đây chính là cú pháp viết hoàn hảo hơn của dấu ấn
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    25,Ví dụ
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    209 sẽ lấy được chuỗi
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    210,
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    211 trong chuỗi "truyền thuyết"

Thay thế thẻ html regex

Đừng lo, hãy xem qua các ví dụ từ rồi bạn sẽ hiểu

Ví dụ đơn giản

Find string number

Thay thế thẻ html regex

Find day

Thay thế thẻ html regex

Liên kết bản trình diễn. https. //regex101. com/r/3dNzjU/1

Find the main date

Trong ví dụ trên thì ta thấy có chuỗi "60/60/2018" cũng được coi là ngày tháng, như thế là không chính xác. Ta hãy viết lại cho chuẩn

Thay thế thẻ html regex

Liên kết bản trình diễn. https. //regex101. com/r/3dNzjU/2

Cách "tóm lấy" chuỗi cần tìm đã đưa vào Group

Thay thế thẻ html regex

Cách tạo mã để sử dụng RegEx trong các ngôn ngữ lập trình

RegEx là bộ cú pháp, tuy nhiên để áp dụng nó vào các ngôn ngữ lập trình lại phải tuân thủ thủ tục theo các thư viện và quy tắc lập trình để truy xuất các Nhóm đã chụp (thu) được. Vui lòng xem các mã tạo ngay sau đây

Thay thế thẻ html regex

Cách bắt bất kỳ chuỗi

Thay thế thẻ html regex
Liên kết bản trình diễn. https. //regex101. com/r/3dNzjU/3

Lấy một chuỗi nhưng không chứa 1 ký tự đặc biệt nào

Ví dụ bạn cần lấy 1 chuỗi dài, nhưng nếu chuỗi đó chứa 1 ký tự đặt biệt nào đó, ví dụ ký tự

31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
212 thì không lấy được dòng đó. Nghĩa là cần loại bỏ 1 ký tự đặc biệt ra khỏi tập kết quả (các trận đấu nhóm) thu được

Thay thế thẻ html regex

Rất đơn giản, chúng ta hãy làm như sau để có thể loại bỏ dấu "/" khỏi kết quả thu được. https. //regex101. com/r/ctuQwj/1

Thay thế thẻ html regex

Giải thích 1 chút, như mình đã nói bên trên, khi sử dụng

31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
213 thì nó sẽ loại bỏ các kết quả có chứa ký tự a hoặc b ra khỏi tệp đã lấy được. Ở đây bạn cần loại bỏ dấu hiệu
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
212 nên ta sẽ viết là
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
215. Và vì chúng ta cần nhân bản nhiều lần các ký tự khác nhau đánh dấu
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
212 để tìm 1 chuỗi dài liên tiếp, cho đến khi gặp 1 số có 4 chữ số. Do đó, ta sẽ viết thêm đuôi
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
217 vào để thành
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
218

Bình thường nếu tìm một chuỗi dài liên tiếp, không quan tâm là ký tự hay chữ số, ta hay viết là

31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
219, do đó cách viết
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
218 thực ra là một biến thể của
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
219

Dấu chấm

31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
25 sẽ bắt được một ký tự bất kỳ ngoại trừ dấu xuống dòng, do đó
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
219 sẽ chỉ bắt được chuỗi dài vô tận ở cùng 1 dòng (1 dòng). Do đó, nếu bạn muốn bắt được chuỗi nằm ở nhiều dòng cho đến khi gặp một chuỗi cố định nào đó, thì bạn sẽ phải sử dụng đến chiêu sau đây

Sử dụng

31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
224 để thay thế cho dấu
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
25 ta sẽ bắt được toàn bộ ký tự bất kỳ bao gồm cả dấu xuống dòng
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
226. Làm vậy để bắt được 1 chuỗi dài vô tận nằm ở nhiều dòng ta sẽ dùng
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
227

Lấy một chuỗi nhưng không chứa 1 chuỗi đặc biệt nào

Bây giờ bạn không chỉ cần loại trừ (bỏ) một ký tự ra khỏi danh sách chuỗi thu được, bạn còn cần loại bỏ Chắc chắn "một chuỗi" thì sao. Do đó, hãy sử dụng cách sau đây

Vấn đề này lúc này cần phải sử dụng đến chức năng Nhìn nhận tiêu cực của Regex, cách hoạt động như sau

Thay thế thẻ html regex

Giả sử mình cần loại trừ (bỏ qua) một chuỗi (chứ không phải 1 ký tự như ví dụ

31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
218 như bên trên nữa) ra khỏi chuỗi đã bắt được. Thì cần dùng cách viết
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
229 (Chú ý là dấu
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
230 và
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
231 là bắt buộc phải viết để đủ cú pháp). Trong đó abc là 1 chuỗi các ký tự liền kề cần loại bỏ. Nếu cần loại bỏ 2 hoặc nhiều chuỗi con thì sao?

Vì chuỗi con nằm bên trong chuỗi cha nên chúng ta cần viết thêm 1 dấu chấm

31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
25 ngay phía sau
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
234 và bọc toàn bộ khối đó lại thành 1 nhóm. Rồi viết thêm
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
217 bên ngoài để nhân bản các ký tự lên thành 1 chuỗi

Như vậy để viết Regex này ta phải tư duy từ bên trong ra bên ngoài. Và việc viết thêm Bản nhìn tiêu cực kèm theo dấu chấm dạng

31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
236 thật ra vẫn chính là một biến thể của
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
219 (bắt một chuỗi dài vô tận, nhưng không chứa chuỗi con cần loại bỏ bên trong nó)

Liên kết bản trình diễn. https. //regex101. com/r/SThqo2/2

Bắt đầu 1 chuỗi bất kỳ nằm ở nhiều dòng (multiline)

Biểu thức RegEx.

31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
238

Sẽ bắt toàn bộ chuỗi nhiều dòng sau đây

31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
1

Giải thích tại sao lại bị bắt. Rất đơn giản, là vì

31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
26 sẽ lấy các ký tự được đặt dấu cách, còn
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
27 sẽ lấy các ký tự được đặt bất kỳ ngoại trừ dấu cách (và
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
27 sẽ bắt được dấu xuống dòng
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
242). Nếu kết hợp 2 ký tự đó ghép vào một khung hình
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
224 tức thì sẽ lấy được 1 trong 2 trường hợp. Sẽ bắt toàn bộ các ký tự bất kỳ bao gồm cả dấu cách nếu gặp. Viết
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
244 thật ra là nhân bản ký tự cần bắt lên nhiều lần để tìm chuỗi dài vô tận

Bình thường nếu tìm một chuỗi dài liên tiếp, không quan tâm là ký tự hay chữ số, ta hay viết là

31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
219, do đó cách viết
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
244 thực ra là một biến thể của
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
219. Dấu chấm
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
25 sẽ bắt được một ký tự bất kỳ ngoại trừ dấu xuống dòng, do đó
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
219 sẽ chỉ bắt được chuỗi dài vô tận ở cùng 1 dòng (1 dòng). Do đó, nếu bạn muốn bắt được chuỗi nằm ở nhiều dòng cho đến khi gặp một chuỗi cố định nào đó, thì bạn sẽ phải sử dụng đến chiêu sau đây. Sử dụng
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
224 để thay thế cho dấu
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
25 ta sẽ bắt được toàn bộ ký tự bất kỳ bao gồm cả dấu xuống dòng
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
226. Làm vậy để bắt được 1 chuỗi dài vô tận nằm ở nhiều dòng ta sẽ dùng
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
227

Các bạn có thể xem link demo. https. //regex101. com/r/irhKCk/1

Sử dụng RegEx trong thực tế

Trong thực tế, RegEx có thể được nhập trực tiếp vào bất kỳ trình chỉnh sửa nào. Ví dụ mình hay sử dụng Notepad++, hoặc Visual Studio

Thay thế thẻ html regex

Thêm thật nhiều ví dụ để bạn tham khảo (để xem sức mạnh của RegEx)

Kiểm tra chuỗi ngày bất kỳ có hợp lệ hay không tính theo năm nhuận

Biểu thức RegEx

31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
2

Sẽ đúng cho

^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$
08

Và sẽ không trùng lặp với

^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$
09

Kiểm tra 1 chuỗi ngày tháng phải có cả ngày và giờ

Biểu thức RegEx

^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$

Sẽ đúng cho

31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02

Và sẽ không trùng lặp với

^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$
2

Kiểm tra 1 chuỗi bất kỳ xem có phải ngày hoặc giờ hay không

Biểu thức RegEx

31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
2

Sẽ đúng cho

31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
2

Và sẽ không trùng lặp với

31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
2Tóm lại
  • Biểu thức chính quy (hay còn gọi là Biểu thức chính quy – viết tắt là RegEx) là một chuỗi ký tự đặc biệt được dùng làm mẫu (pattern) để phân tích sự trùng khớp (match) của một tập hợp các chuỗi con cần lấy ra
  • Chuỗi cha sau khi kiểm tra và lấy ra các chuỗi con thì kết quả được đưa vào các Nhóm kết quả (Matches)
  • Trong mỗi Matches có các Nhóm chứa các chuỗi con có thể cắt lấy ra khỏi chuỗi cha (do người dùng xác định chuỗi con cần lấy hoặc không lấy bằng cách viết thêm các cặp chiết vòng
    31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
    
    254 bao bọc chuỗi con cần lấy)
  • RegEx could get a string (cut) or instead string (replace)
  • Hầu hết các ngôn ngữ lập trình (PHP, C#, Perl, Javascript…) đều cung cấp các thư viện hoặc hàm xử lý để lập trình viên có thể làm việc với Biểu thức chính quy
Tham khảo

Tham khảo thêm toàn bộ cú pháp RegEx bằng tiếng Anh tại. https. //www. gian lận. com/davechild/cheat-sheets/regular-expressions/

Một số công cụ kiểm tra RegEx Online

  • https. //regex101. com/
  • http. //regexr. com/
  • http. //www. biểu thức chính quy. com/
  • http. // regexper. com/
Bài tập về nhà

Bạn vui tay muốn thử học RegEx ngay và luôn cho nóng. Do đó, hãy thử thực hiện một số bài tập từ dễ đến khó sau đây nhé.

Entry file class

  1. Lấy ra các chữ cái có chữ kiểm tra trong chuỗi sau. “bài kiểm tra đã được kiểm tra đó đang kiểm tra các bài kiểm tra của người kiểm tra”
  2. Lấy số điện thoại trong chuỗi sau. ** "P. 444-555-1234 f. 246. 555. 8888 mét. 1235554567”**
  3. Get the RGB color in string after. “#FF006C ABC 99AAB7FF 0xF0F73611”
  4. Get ra các chữ cái có 4 ký tự trong chuỗi sau. “uống bia đi, ngon lắm. ”
  5. Lấy tên tệp trong chuỗi URL sau. “chia sẻ nhanh. com/asd/asd/Tệp. avi. html”

Giải thích ở phần bình luận nhé

Bài tập dành cho học sinh giỏi (lớp học thêm)

  1. Tìm cách lấy các URL trong chuỗi HTML sau
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
20
  1. Tìm cách loại bỏ toàn bộ COMMENT trong đoạn mã sau
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
21
  1. Tìm cách lấy chuỗi tiếng Nhật trong chuỗi sau. “
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
22
  1. Lấy các tệp ảnh và độ phân giải của ảnh từ chuỗi sau
31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
23
  1. Đọc nội dung từ trang tin rss after. http. //rss. cnn. com/rss/ấn bản. rss Lấy ra các tiêu đề, ngày giờ đăng, nội dung tin vắn

Đáp án các bạn đăng vào phần bình luận và cùng trao đổi nhé

Nếu các bài tập trên đây vẫn chưa đủ, các bạn hãy làm thêm các bài tập tại trang https. //regexone. com nhé, rất nhiều ví dụ hay

Kết bài

Hi vọng bài viết nhỏ này đã giúp bạn học được cú pháp viết RegEx và áp dụng vào công việc thường ngày. Mình dùng Regex rất nhiều và nó là trợ thủ đắc lực trong quá trình code

Các bạn thì sao?

Cảm ơn các bạn đã đọc, hãy bình luận, upvote và chia sẻ bạn bè thật nhiều nhé

Cập nhật v2. 2. Thêm các bài tập để các bạn luyện tập thêm (theo yêu cầu của nhiều bạn, nhớ tự làm trước khi dò đáp án nhé ^^. )

BTU1. Tìm ra các chuỗi là số điện thoại trong chuỗi sau. Chú ý một số loại chuỗi không phải là số điện thoại

31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
24

Lời giải https. //regexr. com/38pvb

BTU2. Chuỗi tìm kiếm là địa chỉ email trong chuỗi sau, chú ý loại bỏ các chuỗi k phải địa chỉ emai thực sự

31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
25

Lời giải. https. //regexr. com/3bcrb

BTU3. Tìm cách lấy ra và ngăn cách chuỗi số sau thành phần có phần trăm ước lượng

31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
26

Lời giải. biểu thức chính quy. com/4409r

BTU4. Lấy ra các chuỗi ngăn cách bởi dấu hiệu theo định dạng của một tệp CSV như sau (chú ý là chuỗi bị xuống dòng)

31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
27

Lời giải. https. //regexr. com/3apuc

BTU5. Tìm và xóa đi toàn bộ thẻ HTML trong đoạn văn bản dưới đây

31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
28

Lời giải. https. //regexr. com/3cak1

BTU6. Tìm cách loại bỏ các bảng điều khiển chuỗi. log() do lập trình viên viết để kiểm tra mã trước khi bàn giao

31/12/2003 11:59:59 PM | 29-2-2004 | 01:45:02
29

Lời giải. https. //regexr. com/3fi66

BTU7. Loại bỏ toàn bộ đoạn mã nhận xét trong đoạn mã sau đây

^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$
080

Lời giải. https. //regexr. com/3aeb7

BTU8. Lấy ra các chuỗi là các URL đầy đủ trong đoạn văn bản dưới đây

^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$
081

Lời giải. https. //regexr. com/39nr7

BTU9. Lấy toàn bộ URL của video Youtube từ đoạn text test sau đây

^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$
082

Lời giải. https. //regexr. com/3akf5

BTU10. Lấy đoạn văn bản làm giá trị màu RGB

^(?=\d)(?:(?:31(?!.(?:0?[2469]|11))|(?:30|29)(?!.0?2)|29(?=.0?2.(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00)))(?:\x20|$))|(?:2[0-8]|1\d|0?[1-9]))([-./])(?:1[012]|0?[1-9])\1(?:1[6-9]|[2-9]\d)?\d\d(?:(?=\x20\d)\x20|$))?(((0?[1-9]|1[012])(:[0-5]\d){0,2}(\x20[AP]M))|([01]\d|2[0-3])(:[0-5]\d){1,2})?$
083

Lời giải. https. //regexr. com/38lmo

Biểu thức chính quy (RegExp) Mẹo Thủ thuật Quy ước mã JavaScript Mã Visual Studio thay thế Mã sạch