Biểu thức chính quy bất kỳ số nào. Cú pháp biểu thức chính quy

Dưới đây là một số ví dụ về biểu thức chính quy.

    karova - rõ ràng là một khuôn mẫu phù hợp với từ karova;

    \b(shift|unshift|pop|push|splice)\b - bất kỳ từ nào được liệt kê;

    ^\s+ - một hoặc nhiều dấu cách hoặc tab ở đầu dòng.

Trong biểu thức chính quy, các ký tự chữ và số thường đại diện cho chính chúng. Ví dụ: mẫu Hello chỉ định tìm kiếm ký tự H theo sau là e , sau đó là l , v.v.

Nếu một ký hiệu khó hoặc bất tiện khi chỉ định theo nghĩa đen, bạn có thể sử dụng các ký tự mà chúng ta đã biết: \n , \t và các ký hiệu khác. Điều này có nghĩa là ký tự \ có trong biểu thức chính quy không còn có thể biểu thị chính nó nữa, vì nó thay đổi ý nghĩa của ký tự theo sau nó: đặc biệt, chữ cái n, cùng với ký tự gạch chéo ngược trước, biểu thị ký tự cuối dòng. Nếu bạn muốn bao gồm chính ký tự \ trong mẫu, bạn nên sử dụng chữ \\ .

Có những biểu tượng khác được mang ý nghĩa đặc biệt trong các mẫu thay vì thể hiện chính chúng. Những ký hiệu như vậy được gọi là siêu ký tự. Chúng ta hãy đưa ra một vài ví dụ về siêu ký tự mà chưa chỉ ra ý nghĩa đặc biệt của chúng (danh sách chưa đầy đủ): \.-()()?*+^$| .

Một số nhân vật không phải lúc nào cũng trở thành siêu ký tự mà chỉ khi họ rơi vào một bối cảnh nhất định. Một số siêu ký tự có ý nghĩa khác nhau tùy thuộc vào ngữ cảnh.

Nếu bạn cần chèn một siêu ký tự vào một biểu thức chính quy, khiến nó không còn ý nghĩa nữa, bạn nên bảo vệ nó ( cái khiên), đặt một dấu gạch chéo ngược trước mặt anh ta. Ví dụ: dấu cộng trong biểu thức chính quy được chèn dưới dạng \+ .

Mẫu chỉ định một trong các ký tự được liệt kê trong dấu ngoặc vuông. Ví dụ: nếu chúng ta quan tâm đến từ Hello, không quan trọng nó được viết hoa hay nhỏ, mẫu sẽ như thế này: ello. Đây là mẫu biểu thị một chữ cái nguyên âm nhỏ trong bảng chữ cái tiếng Anh: . Một ví dụ khác là một lớp ký tự bao gồm cả hai dấu ngoặc vuông: [\[\]] .

Nếu một lớp ký tự bao gồm các ký tự liên tiếp trong bảng mã thì chỉ cần chỉ ra ký tự đầu tiên và ký tự cuối cùng, chèn dấu gạch nối giữa chúng là đủ. Ví dụ: một lớp đại diện cho bất kỳ chữ số thập phân nào có thể được chỉ định là . Một chữ cái trong bảng chữ cái tiếng Anh được chỉ định là (ở đây chúng tôi dựa vào thực tế là trong bất kỳ bảng mã nào, các chữ cái tiếng Anh viết hoa và viết thường xuất hiện trong các khối liền kề theo thứ tự bảng chữ cái; tuy nhiên, một khối chữ nhỏ không ngay sau một khối chữ hoa bức thư).

Có thể định nghĩa một lớp ký tự bao gồm tất cả các ký tự ngoại trừ những ký tự được liệt kê - cái gọi là phủ định lớp ký tự. Để làm điều này, dấu thập phân ^ được chèn ngay sau dấu ngoặc vuông mở trước bảng liệt kê. Bất kỳ ký tự nào không phải là số đều có thể được biểu diễn dưới dạng [^0-9] .

Có những ký hiệu đặc biệt cho một số lớp nhân vật phổ biến:

Khi một chuỗi được khớp thành công với một biểu thức chính quy, mỗi ký tự hoặc lớp ký tự trong mẫu sẽ được khớp với một số ký tự trong chuỗi. Nhưng có những cấu trúc không biểu thị sự hiện diện của một ký tự nhất định mà chỉ một vị trí (trống) nhất định trong dòng. Những công trình như vậy được gọi là sự ràng buộc, hoặc mỏ neo

Các neo được sử dụng phổ biến nhất là neo (^) và cuối ($) của chuỗi. Điểm neo đầu dòng phải được đặt ở đầu mẫu và điểm neo cuối dòng phải được đặt ở cuối.

Ví dụ: các từ tiếng Nga như thuốc giải độc, chủ nghĩa bài Do Thái hoặc phản hạt phù hợp với mẫu ^anti. Nếu không có liên kết, những dòng không bắt đầu bằng “anti-”, nhưng có tổ hợp chữ cái này bên trong, cũng sẽ phù hợp, chẳng hạn như chủ nghĩa trọng thương. Để tìm kiếm các từ kết thúc bằng “-tsya”, bạn cần mẫu tsya$ (chúng tôi gần như chắc chắn 100% rằng tất cả những từ như vậy đều là động từ phản thân ở nguyên thể). Không có gì ngăn cản bạn sử dụng cả hai ràng buộc này trong mẫu của mình.

Một neo hữu ích khác là neo ranh giới từ \b . Nó khớp với khoảng trắng trong một chuỗi giữa các ký tự, một trong số đó thuộc lớp \w và ký tự kia thuộc lớp \W (theo bất kỳ thứ tự nào). Điểm neo này cũng có thể khớp với phần đầu hoặc phần cuối của một chuỗi (trong trường hợp đó chuỗi được coi là được bao quanh bởi các ký tự tưởng tượng từ lớp \W).

Nếu chúng ta đang tìm kiếm một đoạn phù hợp với một trong nhiều mẫu, chúng ta cần liệt kê các mẫu này, cách nhau bằng dấu gạch ngang | . Ví dụ: Thứ Hai|Thứ Ba|Thứ Tư|Thứ Năm|Thứ Sáu|Thứ Bảy|Chủ Nhật. Để làm cho danh sách các lựa chọn thay thế trở thành một đơn vị độc lập và tách biệt với các đơn vị lân cận thì nó phải được đặt trong ngoặc đơn. Ví dụ: mẫu được tôn trọng có nghĩa là chuỗi được tôn trọng theo sau là một trong các chuỗi th hoặc th. Nếu không có dấu ngoặc đơn, mẫu Dear|aya sẽ biểu thị một trong các chuỗi Dear hoặc aya. Dấu ngoặc có một tác dụng phụ quan trọng, tác dụng này sẽ được thảo luận trong phần “Nhóm và chụp”.

Để cho biết một mẫu có thể được lặp lại bao nhiêu lần, cái gọi là định lượng(từ tiếng Latin lượng tử- Bao nhiêu):

Các định lượng * , + và ? là dư thừa vì chúng có thể được biểu diễn khác nhau bằng cách sử dụng dấu ngoặc nhọn. Cụ thể, * tương đương với (0,) , + tương đương với (1,) , phải không? - giống như (0,1) . Nhưng những bộ định lượng này rất thường được sử dụng và do đó xứng đáng được chỉ định riêng.

Nếu mẫu mà bộ định lượng được áp dụng phức tạp hơn chỉ một ký tự hoặc lớp ký tự thì nó phải được đặt trong dấu ngoặc đơn.

Dưới đây là một số ví dụ:

    ^\d+$ - một chuỗi gồm một hoặc nhiều chữ số thập phân (mẫu cho các số nguyên không âm trong ký hiệu thập phân);

    ^\-?\d+$ - điều tương tự, nhưng đối với tất cả các số nguyên (có thể âm);

    ^\-?(\d+(\.\d*)?|\.\d+)$ - mẫu cho số thực;

Hãy xem xét ví dụ cuối cùng chi tiết hơn. Ngoài dấu trừ tùy chọn ở đầu, mẫu còn chứa một nhóm có hai lựa chọn thay thế: \d+(\.\d*)? và \.\d+ . Phương án thay thế đầu tiên có bao gồm phần nguyên bắt buộc \d+ (ít nhất một chữ số), theo sau là phần phân số tùy chọn (\.\d*) không? . Phần phân số, nếu có, có dấu thập phân và có thể có nhiều chữ số. Như vậy, phương án này tương ứng với các dòng 15, 15., 15.487. Một giải pháp thay thế khác là cần thiết cho các chuỗi có dạng .618 bị thiếu phần nguyên - trong nhiều ngôn ngữ máy tính, mục này có quyền tồn tại.

Nếu các phần tử đơn giản nhất của biểu thức chính quy - ký tự, lớp ký tự và neo - được viết thành một hàng, điều này có nghĩa là khi tìm kiếm một mẫu trong một chuỗi, các phần tử này sẽ được so khớp với các phần của chuỗi một cách tuần tự, theo cùng một trình tự . Lệnh này bị vi phạm nếu các lựa chọn thay thế được áp dụng. Bạn có thể tưởng tượng rằng một biểu thức chính quy phức hợp được tạo thành từ những biểu thức đơn giản bằng cách sử dụng hai thao tác: nối tuần tự ( sáng tác) và các lựa chọn thay thế. Thành phần là một dạng tương tự của phép nhân trong số học. Một sự thay thế là một sự tương tự của phép cộng. Điểm tương đồng đầu tiên với số học là phép toán thay thế có mức ưu tiên thấp hơn phép kết hợp, vì vậy có thể cần phải nhóm các dấu ngoặc đơn, như trong ví dụ Dear.

Ghi chú

Nhiều, mặc dù không phải tất cả, các định luật số học cũng áp dụng cho biểu thức chính quy:

tính giao hoán của phương án thay thế x | y = y | x ; sự kết hợp của sự thay thế x | y | z = x | y | z ; tính kết hợp thành phần x ⁣ y ⁣ z = x ⁣ y ⁣ z ; mức độ phân bổ của phương án thay thế so với thành phần (trái và phải) x ⁣ y | z = x ⁣ y | x ⁣ z , x | y ⁣ z = x ⁣ z | y ⁣ z .

Trong số học kỳ lạ này của các biểu thức chính quy, định luật giao hoán cho thành phần không đúng. Ngoài ra, không có sự tương tự của số 0 do mối quan hệ hiển nhiên x | x = x . Vai trò của đơn vị (phải và trái) đối với bố cục được thực hiện bởi một mẫu trống (hãy ký hiệu là 𝟙): 𝟙 ⁣ x = x ⁣ 𝟙 = x. Các định lượng có dạng ( n ) đóng vai trò nâng lên lũy thừa thứ n.

Ngoài chức năng nhóm, dấu ngoặc còn thực hiện chức năng thu thập. Kết quả chính của việc khớp một chuỗi với một mẫu là câu trả lời cho câu hỏi: chuỗi đó có khớp với mẫu không? Tuy nhiên, ngoài ra, thường cần phải xác định đoạn nào hoặc các đoạn của chuỗi khớp với các đoạn nhất định trong biểu thức chính quy.

Hoặc có thể là axit ethylenediamine-N N N ′ N′-tetraacetic?

Hãy xem xét một ví dụ trong đó có đề cập đến các loại axit khác nhau trong văn bản. Ký ức thời học sinh về hóa học đã khiến chúng tôi nảy ra ý tưởng rằng tên của axit kết thúc bằng vaya, naya, hoặc taya, và sau một khoảng trắng, từ axit sẽ theo sau. Chúng tôi tạo một mẫu: \S+[int]axit. Chúng tôi khớp văn bản với mẫu. May mắn! Nhưng người ta thắc mắc, loại axit nào được đề cập trong văn bản? Mặn? Lưu huỳnh? Nitơ? Plavikova? Clo? Clo? Hypochlorous? Chanh vàng? Tội lỗi? Deoxyribonucleic?

Đây là nơi tay cầm có ích. Chúng tôi đặt phần đó của mẫu, theo kế hoạch của chúng tôi, phải tương ứng với tên trong ngoặc: axit (\S+[int]th). Sau đó, máy, khi tìm thấy đề cập đến axit trong văn bản, sẽ lưu tên của nó (tên tương ứng với đoạn mẫu được đặt trong ngoặc) trong một biến đặc biệt - bộ đệm chụp

Một biểu thức chính quy có thể chứa nhiều nhóm chụp. Những nhóm như vậy không chỉ có thể theo dõi nhau mà còn có thể lồng vào nhau. Nói cách khác, biểu thức chính quy phải được cân bằng với dấu ngoặc đơn theo nghĩa tương tự như đã thảo luận trong Chương 23." Kiểm tra sự cân bằng của dấu ngoặc" (tất nhiên, điều này chỉ áp dụng cho các dấu ngoặc đơn phục vụ mục đích nhóm và thu thập; các dấu ngoặc đơn đứng trước dấu gạch chéo ngược không ảnh hưởng đến cân bằng nhóm). Nếu tìm kiếm thành công, mỗi nhóm sẽ ghi lại một phần văn bản: phần đầu tiên vào bộ đệm đầu tiên, phần thứ hai vào bộ đệm thứ hai, v.v. Các nhóm được đánh số như thế nào khi chúng được lồng vào nhau? Việc đánh số theo thứ tự xuất hiện dấu ngoặc mở:

2 4 5 ┝┑ ┝┑┝┑ (()(()())) │ ┝━━━━┙│ │ 3 │ ┝━━━━━━━━┙ 1

Nếu muốn, một nhóm có thể được loại khỏi việc đánh số, nghĩa là bị tước bỏ chức năng “tích cực” của nó, chỉ để lại chức năng nhóm. Để làm điều này, thay vì dấu phân cách nhóm (⋯), chúng tôi sử dụng ( ?: ⋯) . Có một dấu chấm hỏi ở đây Không biểu thị một bộ định lượng vì bộ định lượng phải được đặt trước bởi một ký tự, một lớp ký tự hoặc một nhóm.

Việc sử dụng các nhóm chụp được đánh số không phải lúc nào cũng thuận tiện, đặc biệt là trong các biểu thức chính quy lớn. Ngay khi bạn chèn một nhóm chụp mới vào mẫu, việc đánh số sẽ bị mất. Sau đó, bạn sẽ phải thực hiện chỉnh sửa ở tất cả các vị trí trong chương trình nơi bộ đệm chụp được truy cập theo số. Tuy nhiên, bạn có thể liên kết tên với một nhóm cho phép bạn truy cập bộ đệm tương ứng theo tên đó. Để tạo một nhóm được đặt tên, hãy sử dụng dấu phân cách ( ? ⋯) , trong đó tên mong muốn được thay thế cho tên.

Các phần của chuỗi được ghi vào bộ đệm có thể được sử dụng theo hai cách. Đầu tiên, một chương trình sử dụng biểu thức chính quy để tìm hoặc thay thế có thể coi bộ đệm là các biến đặc biệt. Việc sử dụng này sẽ được thảo luận trong phần “Toán tử tìm kiếm và thay thế”. Khả năng thứ hai liên quan đến việc sử dụng liên kết trực tiếp đến các nhóm trong biểu thức chính quy, xem phần “Liên kết ngược”.

Xét bài toán tìm các từ chứa ba chữ cái nguyên âm giống nhau liên tiếp. Giải pháp ngây thơ [aеооуеуя](3) sử dụng bộ định lượng sẽ không hiệu quả, vì mẫu này khớp với các chuỗi có ba nguyên âm liên tiếp, nhưng không nhất thiết phải giống nhau. Chúng tôi phẫn nộ từ chối một giải pháp quái dị với một danh sách đầy đủ các lựa chọn thay thế, aaa|eeee|yoyo|iii|oooo|uuu|eeee|yuyuyu|yayay: xét cho cùng, đáng để tham gia một lớp biểu tượng khác, rộng rãi hơn hoặc thay thế bộ ba trong bộ định lượng có giá trị lớn hơn, chẳng hạn như kích thước mẫu sẽ tăng lên một cách thảm khốc.

Tuy nhiên, có thể có một giải pháp tao nhã bằng cách sử dụng các nhóm chụp. Hãy nắm bắt nguyên âm thành một nhóm và sau đó tham chiếu nội dung của bộ đệm chụp. Các tham chiếu đến bộ đệm thứ nhất, thứ hai, thứ ba được viết bằng biểu thức chính quy như \g1, \g2, \g3. Vì vậy, giải pháp là mẫu ([aeeioueyuya])\g1(2) . Xin lưu ý rằng tham chiếu đến bộ đệm chụp phải được đặt đúng sau nhóm tương ứng trong biểu thức chính quy.

Liên kết ngược có thể không chỉ đề cập đến bộ đệm được đánh số mà còn đề cập đến bộ đệm được đặt tên. Các liên kết như vậy trông giống như \k , một lần nữa, thay vì tên lại có một tên cụ thể. Ví dụ của chúng tôi có thể được viết lại bằng cách sử dụng các nhóm được đặt tên: (? [aeeioueyuya])\k {2} (nguyên âm- nguyên âm).

Đôi khi có nhu cầu tìm kiếm không phân biệt chữ thường và chữ hoa. Tìm kiếm này được gọi là trường hợp không nhạy cảm (trường hợp không nhạy cảm). Thay vì thay thế các chữ cái ở mọi nơi trong mẫu bằng các lớp gồm hai chữ cái (a → , b → , ...), chúng ta chỉ cần đặt mẫu trong một nhóm đặc biệt bao gồm chế độ tìm kiếm không phân biệt chữ hoa chữ thường: (? Tôi:⋯) . Nhóm như vậy không phải là nhóm bắt giữ. Nếu việc tìm kiếm không phân biệt chữ hoa chữ thường chỉ được thực hiện trên một phần của biểu thức chính quy thì chỉ nên đặt phần bắt buộc vào nhóm.

Ngược lại, nếu một phần nào đó của biểu thức chính quy trong đó tìm kiếm không phân biệt chữ hoa chữ thường cần phải tắt chế độ này thì bạn có thể quay lại tìm kiếm thông thường, phân biệt chữ hoa chữ thường bằng cách sử dụng nhóm ( ?-Tôi: ⋯) .

Chế độ phân biệt chữ hoa chữ thường/không phân biệt chữ hoa chữ thường chỉ ảnh hưởng đến các chữ cái. Những gì được tính là một chữ cái và những gì không phụ thuộc vào ngôn ngữ, cũng như các quy tắc khớp chữ hoa và chữ thường. Ví dụ, theo quan điểm của ngôn ngữ tiếng Anh, ký hiệu Ш không phải là một chữ cái. Trong tiếng Đức có chữ cái ß (nhân tiện, chữ in hoa của chữ cái này bao gồm hai chữ cái SS: Carl Friedrich Gauß). → CARL FRIEDRICH GAUSS).

Bảng cheat là hướng dẫn chung về các mẫu biểu thức chính quy mà không tính đến các chi tiết cụ thể của bất kỳ ngôn ngữ nào. Nó được trình bày dưới dạng một bảng vừa với một tờ in khổ A4. Được tạo theo giấy phép Creative Commons dựa trên cheat sheet của Dave Child ().

Hãy nhớ rằng các ngôn ngữ lập trình khác nhau hỗ trợ các biểu thức chính quy ở các mức độ khác nhau, do đó bạn có thể gặp phải tình huống một số tính năng được hiển thị không hoạt động. Đối với những người mới làm quen với các biểu thức thông thường, bản dịch nhận xét của tác giả sang bảng cheat này được cung cấp. Nó sẽ giới thiệu cho bạn một số kỹ thuật được sử dụng để xây dựng các mẫu biểu thức chính quy.

Các neo trong biểu thức chính quy cho biết sự bắt đầu hoặc kết thúc của một điều gì đó. Ví dụ: dòng hoặc từ. Chúng được đại diện bởi các biểu tượng nhất định. Ví dụ: một mẫu khớp với một chuỗi bắt đầu bằng một số sẽ trông như thế này:

Ở đây ký tự ^ biểu thị sự bắt đầu của dòng. Nếu không có nó, mẫu sẽ khớp với bất kỳ chuỗi nào chứa chữ số.

Các lớp ký tự trong biểu thức chính quy khớp với một bộ ký tự nhất định cùng một lúc. Ví dụ: \d khớp với bất kỳ số nào từ 0 đến 9, \w khớp với các chữ cái và số và \W khớp với tất cả các ký tự không phải chữ cái và số. Mẫu xác định chữ cái, số và khoảng trắng trông như thế này:

POSIX

POSIX là một bổ sung tương đối mới cho dòng biểu thức chính quy. Ý tưởng, cũng như các lớp ký tự, là sử dụng các phím tắt đại diện cho một số nhóm ký tự.

Hầu hết mọi người ban đầu đều gặp khó khăn trong việc hiểu những lời khẳng định, nhưng khi bạn trở nên quen thuộc hơn với chúng, bạn sẽ thấy mình sử dụng chúng khá thường xuyên. Các xác nhận cung cấp một cách để nói: “Tôi muốn tìm mọi từ trong tài liệu này bao gồm chữ cái “q” và không có chữ “werty” theo sau.

[^\s]*q(?!werty)[^\s]*

Đoạn mã trên bắt đầu bằng cách tìm kiếm bất kỳ ký tự nào ngoài khoảng trắng ([^\s]*) theo sau là q . Trình phân tích cú pháp sau đó đạt được một xác nhận hướng tới tương lai. Điều này tự động làm cho phần tử đứng trước (ký tự, nhóm hoặc lớp ký tự) có điều kiện—nó sẽ chỉ khớp với mẫu nếu câu lệnh đúng. Trong trường hợp của chúng tôi, câu lệnh là phủ định (?!), nghĩa là nó sẽ đúng nếu không tìm thấy thứ đang được tìm kiếm trong đó.

Vì vậy, trình phân tích cú pháp sẽ kiểm tra một số ký tự tiếp theo dựa trên mẫu được đề xuất (werty). Nếu chúng được tìm thấy thì câu lệnh là sai, có nghĩa là ký tự q sẽ bị “bỏ qua”, tức là nó sẽ không khớp với mẫu. Nếu không tìm thấy werty thì phát biểu đúng và mọi thứ đều đúng với q. Sau đó, việc tìm kiếm tiếp tục với bất kỳ ký tự nào ngoài khoảng trắng ([^\s]*).

Nhóm này chứa các mẫu mẫu. Với sự giúp đỡ của họ, bạn có thể thấy cách sử dụng biểu thức chính quy trong thực hành hàng ngày. Tuy nhiên, hãy lưu ý rằng chúng không nhất thiết phải hoạt động ở mọi ngôn ngữ lập trình, vì mỗi ngôn ngữ đều có các tính năng độc đáo riêng và mức độ hỗ trợ biểu thức chính quy khác nhau.

Bộ định lượng cho phép bạn xác định một phần của mẫu phải được lặp lại nhiều lần liên tiếp. Ví dụ: nếu bạn muốn tìm hiểu xem tài liệu có chứa một chuỗi từ 10 đến 20 chữ cái (bao gồm) "a" hay không, thì bạn có thể sử dụng mẫu này:

A(10,20)

Theo mặc định, các bộ định lượng là “tham lam”. Do đó, bộ định lượng +, nghĩa là “một hoặc nhiều lần,” sẽ tương ứng với giá trị lớn nhất có thể. Đôi khi điều này gây ra vấn đề, trong trường hợp đó bạn có thể yêu cầu bộ định lượng ngừng tham lam (trở nên "lười biếng") bằng cách sử dụng một bộ sửa đổi đặc biệt. Nhìn vào mã này:

".*"

Mẫu này khớp với văn bản được đặt trong dấu ngoặc kép. Tuy nhiên, dòng nguồn của bạn có thể giống như thế này:

Chào thế giới

Mẫu trên sẽ tìm thấy chuỗi con sau trong dòng này:

"helloworld.htm" title="Xin chào thế giới" !}

Hóa ra anh ta quá tham lam, chộp lấy đoạn văn bản lớn nhất có thể.

".*?"

Mẫu này cũng khớp với bất kỳ ký tự nào được đặt trong dấu ngoặc kép. Nhưng phiên bản lười biếng (có chú ý đến công cụ sửa đổi không?) tìm kiếm sự xuất hiện nhỏ nhất có thể và do đó sẽ tìm thấy từng chuỗi con được trích dẫn kép riêng lẻ:

"helloworld.htm" "Xin chào thế giới"

Biểu thức chính quy sử dụng các ký tự nhất định để thể hiện các phần khác nhau của mẫu. Tuy nhiên, một vấn đề sẽ nảy sinh nếu bạn cần tìm một trong các ký tự này trong một chuỗi, giống như một ký tự thông thường. Ví dụ: dấu chấm trong biểu thức chính quy có nghĩa là “bất kỳ ký tự nào không phải là dấu ngắt dòng”. Nếu bạn cần tìm một điểm trong chuỗi, bạn không thể chỉ sử dụng " . ” làm mẫu - điều này sẽ dẫn đến việc tìm thấy hầu hết mọi thứ. Vì vậy, bạn cần nói với trình phân tích cú pháp rằng dấu chấm này phải được coi là dấu chấm thông thường chứ không phải "bất kỳ ký tự nào". Điều này được thực hiện bằng cách sử dụng dấu hiệu thoát.

Ký tự thoát đứng trước một ký tự như dấu chấm khiến trình phân tích cú pháp bỏ qua chức năng của nó và coi nó như một ký tự bình thường. Có một số ký tự yêu cầu thoát như vậy trong hầu hết các mẫu và ngôn ngữ. Bạn có thể tìm thấy chúng ở góc dưới bên phải của bảng cheat (“Biểu tượng Meta”).

Mẫu tìm điểm là:

\.

Các ký tự đặc biệt khác trong biểu thức chính quy khớp với các phần tử bất thường trong văn bản. Ví dụ: ngắt dòng và tab có thể được gõ trên bàn phím nhưng có thể gây nhầm lẫn giữa các ngôn ngữ lập trình. Ký tự thoát được sử dụng ở đây để báo cho trình phân tích cú pháp coi ký tự tiếp theo là ký tự đặc biệt thay vì chữ cái hoặc số thông thường.

Sự thay thế chuỗi được mô tả chi tiết trong đoạn tiếp theo, “Nhóm và Phạm vi”, nhưng sự tồn tại của các nhóm “thụ động” nên được đề cập ở đây. Đây là các nhóm bị bỏ qua trong quá trình thay thế, điều này rất hữu ích nếu bạn muốn sử dụng điều kiện "hoặc" trong mẫu nhưng không muốn nhóm đó tham gia thay thế.

Các nhóm và phạm vi rất, rất hữu ích. Có lẽ dễ dàng hơn để bắt đầu với phạm vi. Chúng cho phép bạn chỉ định một tập hợp các ký tự phù hợp. Ví dụ: để kiểm tra xem một chuỗi có chứa các chữ số thập lục phân (0 đến 9 và từ A đến F hay không), bạn sẽ sử dụng phạm vi sau:

Để kiểm tra điều ngược lại, hãy sử dụng phạm vi âm, trong trường hợp của chúng tôi phù hợp với bất kỳ ký tự nào ngoại trừ các số từ 0 đến 9 và các chữ cái từ A đến F:

[^A-Fa-f0-9]

Các nhóm thường được sử dụng nhiều nhất khi cần có điều kiện "hoặc" trong một mẫu; khi bạn cần tham khảo một phần của mẫu từ một phần khác của mẫu đó; và cả khi thay thế chuỗi.

Việc sử dụng "hoặc" rất đơn giản: mẫu sau tìm kiếm "ab" hoặc "bc":

Nếu trong một biểu thức chính quy cần tham chiếu đến một trong các nhóm trước đó, bạn nên sử dụng \n , trong đó thay vì n thay thế số của nhóm mong muốn. Bạn có thể cần một mẫu khớp với các chữ cái "aaa" hoặc "bbb", theo sau là một số và sau đó là ba chữ cái tương tự. Mẫu này được triển khai bằng cách sử dụng các nhóm:

(aaa|bbb)+\1

Phần đầu tiên của mẫu tìm kiếm "aaa" hoặc "bbb", kết hợp các chữ cái được tìm thấy thành một nhóm. Tiếp theo là tìm kiếm một hoặc nhiều chữ số (+) và cuối cùng là \1. Phần cuối cùng của mẫu tham chiếu đến nhóm đầu tiên và tìm kiếm điều tương tự. Nó tìm kiếm sự trùng khớp với văn bản đã được tìm thấy trong phần đầu tiên của mẫu chứ không khớp với văn bản đó. Vì vậy, "aaa123bbb" sẽ không đáp ứng mẫu trên vì \1 sẽ tìm "aaa" sau số.

Một trong những công cụ hữu ích nhất trong biểu thức chính quy là thay thế chuỗi. Khi thay thế văn bản, bạn có thể tham chiếu nhóm được tìm thấy bằng cách sử dụng $n . Giả sử bạn muốn đánh dấu tất cả các từ "mong muốn" trong văn bản in đậm. Để thực hiện việc này, bạn nên sử dụng hàm thay thế biểu thức chính quy, hàm này có thể trông giống như sau:

Thay thế(mẫu, thay thế, chủ đề)

Tham số đầu tiên sẽ giống như thế này (bạn có thể cần thêm một vài ký tự cho hàm cụ thể này):

([^A-Za-z0-9])(mong muốn)([^A-Za-z0-9])

Nó sẽ tìm thấy bất kỳ sự xuất hiện nào của từ "wish" cùng với các ký tự trước và tiếp theo, miễn là chúng không phải là chữ cái hoặc số. Sau đó, sự thay thế của bạn có thể như thế này:

$1$2$3

Nó sẽ thay thế toàn bộ chuỗi được tìm thấy bằng mẫu. Chúng tôi bắt đầu thay thế bằng ký tự đầu tiên được tìm thấy (đó không phải là chữ cái hoặc số), đánh dấu nó $1 . Nếu không có điều này, chúng tôi sẽ chỉ xóa ký tự này khỏi văn bản. Điều tương tự cũng xảy ra khi kết thúc việc thay thế ($3). Ở giữa chúng tôi đã thêm một thẻ HTML để in đậm (tất nhiên, bạn có thể sử dụng CSS hoặc ), phân bổ cho họ nhóm thứ hai được tìm thấy bằng cách sử dụng mẫu ($2).

Công cụ sửa đổi mẫu được sử dụng trong một số ngôn ngữ, đặc biệt là Perl. Chúng cho phép bạn thay đổi cách hoạt động của trình phân tích cú pháp. Ví dụ: công cụ sửa đổi i khiến trình phân tích cú pháp bỏ qua các trường hợp.

Các biểu thức chính quy trong Perl được bao quanh bởi cùng một ký tự ở đầu và cuối. Đây có thể là bất kỳ ký tự nào (thường được sử dụng nhất là “/”) và nó trông như thế này:

/mẫu/

Công cụ sửa đổi được thêm vào cuối dòng này, như sau:

/mẫu/tôi

Cuối cùng, phần cuối cùng của bảng chứa các ký tự meta. Đây là những ký tự có ý nghĩa đặc biệt trong biểu thức chính quy. Vì vậy, nếu bạn muốn sử dụng một trong số chúng làm ký tự thông thường thì nó cần phải được thoát. Để kiểm tra sự hiện diện của dấu ngoặc đơn trong văn bản, hãy sử dụng mẫu sau:

Chân thanh cảm ơn bạn. đặc biệt là để làm rõ. Không có chi :) cảm ơn bạn rất nhiều. Cảm ơn bạn rất nhiều! Cảm ơn bạn. Bộ truyện hay... nhân tiện, tôi đang dịch bộ truyện này từ tiếng Anh (và dịch nó ở định dạng HTML), bạn có thể xem nó trên trang web của tôi: sitemaker.x10.bz. Ngoài ra còn có một bảng cheat về HTML, không có ở đây. Cảm ơn. Còn việc loại bỏ 10 ký tự đầu tiên thuộc bất kỳ loại nào, sau đó sẽ có một số văn bản có ký hiệu, sau đó từ một ký hiệu nhất định, bạn sẽ cần xóa mọi thứ cho đến cuối. !? 2 lails: Biểu thức thông thường không cần thiết ở đây. Substr() và strpos() sẽ giúp bạn nếu chúng ta đang nói về PHP hoặc các chất tương tự của chúng trong các ngôn ngữ khác. Thật thú vị khi đọc về những tuyên bố, tôi dần dần hiểu ra. Cách này sẽ rõ ràng hơn: http://pcreonline.com/OazZNu/ Xin chào. Vui lòng cho tôi biết tại sao “những tuyên bố lạc hậu” không có tác dụng với tôi trong FireFox? Trợ giúp RegExp của Mozilla hoàn toàn không có chúng, điều đó thực sự không thể thực hiện được ở Fox? =((( Chào buổi sáng, các câu lệnh nhìn về quá khứ không được JavaScript hỗ trợ, vì vậy rất có thể chúng cũng sẽ không hoạt động trên các trình duyệt khác. Liên kết này có thông tin chi tiết hơn về những hạn chế của biểu thức chính quy trong ngôn ngữ JavaScript. Làm tốt lắm! Hãy hét lên! Cảm ơn bạn! Ngắn gọn và rõ ràng! Hmm. Cảm ơn bạn rất nhiều, cảm ơn bạn rất nhiều! Hãy cho tôi biết, nếu bạn cần giới hạn mật khẩu ở số lượng và không quá 5! Xin chào, bảng cheat tốt cho tất cả mọi người, nhưng bạn có thể làm cho con ngựa vằn sáng hơn không, vì khi bạn in chữ màu đen trên nền tối, nó không đẹp lắm. Cảm ơn bạn. ​​giữa start= và &, nhưng đồng thời loại trừ các ranh giới phạm vi này khỏi đầu ra. Cách tìm phạm vi đã thực hiện: start=.(1,)&.
Nhưng vẫn chưa có đủ kiến ​​thức về cách xóa bỏ biên giới. Tôi sẽ biết ơn sự giúp đỡ của bạn. Vui lòng cho tôi biết cách đặt biểu thức chính quy để kiểm tra (có thể có hoặc không khớp)? Cách viết chính xác biểu thức chính quy bắt đầu bằng dấu bằng, tìm bất kỳ văn bản nào bên trong và dừng ở dấu &
Những ký tự này không được đưa vào tìm kiếm; phần bắt buộc của chuỗi bắt đầu và kết thúc bằng chúng...

Tôi viết theo nhiều cách, nhưng kết quả là tất cả văn bản vẫn còn, nhưng dấu = và & biến mất
Hoặc & vẫn ở cuối dòng ...
Mình đọc về đô la thì nó không bỏ ký tự cuối dòng

ví dụ nhỏ

var reg = /[^=]*[^&]/g
str.match(reg);

Theo logic, chúng ta bắt đầu bằng dấu bằng và tìm kiếm bất kỳ văn bản nào /[^=]*
sau đó chúng ta dừng lại ở dấu & [^&] mà không đưa nó vào tìm kiếm và lặp lại tìm kiếm lâu hơn cho đến khi chúng ta đi vòng quanh nó hoàn toàn /g

Không hoạt động... Trả về toàn bộ chuỗi

Chào buổi tối, cho tôi biết làm thế nào để tìm một số nhỏ hơn 20? Cảm ơn các bạn Cảm ơn vì bài viết! Hãy cho tôi biết, nếu bạn cần giới hạn mục nhập mật khẩu ở số và không quá 5 chữ cái thì sao?

Dima @ 24 Tháng Tư, 2015
Trả lời:((?=.*\d)(?=.*)(?=.*).(8,15))--- ở cuối, thay vì 8, chỉ cần đặt 5

Xin chào mọi người, tôi mới bắt đầu...
Bạn có thể cho tôi biết nó có nghĩa là gì:
/^\w\w/a
Tôi sẽ rất biết ơn) Xin chào, hãy cho tôi biết cách liệt kê tất cả các số trong biểu thức này cách nhau bằng dấu cách 9*2 Divine cheat sheet! Đã giải quyết được mọi thắc mắc :-) (M1)
(M2)
(M3)
(M4)
(M5)

Hãy cho tôi biết cách viết một biểu thức để tìm vị trí nó xuất hiện trong văn bản

Tôi quyết định viết một bảng cheat về các biểu thức thông thường. Có lẽ một ngày nào đó tôi sẽ quên họ. Ngoài ra, bài đăng này có thể được coi là phần tiếp theo của loạt bài hướng dẫn Perl của tôi.

1. Giới thiệu

Một vài lời dành cho những ai chưa hiểu rõ chúng ta đang nói về điều gì. Bạn đã bao giờ nhìn thấy mặt nạ tên tệp - tất cả các loại *.html, tên tệp.(txt|csv), v.v. chưa? Vì vậy, các biểu thức chính quy là những “mặt nạ” giống nhau, chỉ phức tạp hơn. Ở bên tay phải, biểu thức chính quy có thể là một công cụ vô cùng mạnh mẽ. Bằng cách này hay cách khác, chúng được sử dụng trong 95% tập lệnh của tôi.

Nhiều người, không phải vô lý, tin rằng biểu thức chính quy là một ngôn ngữ lập trình độc lập hơn là một phần của bất kỳ ngôn ngữ nào. Biểu thức chính quy được tìm thấy trong các tệp cấu hình Perl, PHP, Python, JavaScript, Apache... Tùy thuộc vào ngôn ngữ, có thể có một số khác biệt nhỏ trong cú pháp của biểu thức chính quy, nhưng ý tưởng cơ bản là giống nhau.

Do đó, mặc dù thực tế là tất cả các ví dụ trong ghi chú đều được viết bằng Perl, thông tin được cung cấp cũng sẽ hữu ích cho các lập trình viên sử dụng bất kỳ ngôn ngữ nào khác trong công việc của họ. Ví dụ: mã này trong PHP:

if (preg_match ("//" , $text ) ) (
// văn bản chứa số
) khác (
// không có số nào trong văn bản
}

và cái này trong Perl:

nếu ($văn bản =~ // ) (
# văn bản chứa số
) khác (

}

Làm điều tương tự. Như bạn có thể đoán từ các nhận xét trong mã, có một kiểm tra để xem liệu chuỗi $text có chứa ít nhất một chữ số hay không.

2. Ví dụ đơn giản

Như mọi khi, chúng ta sẽ học hỏi từ các ví dụ. Dấu ngoặc vuông trong biểu thức chính quy có nghĩa là "một trong các ký tự được liệt kê phải có ở đây." Ví dụ, biểu thức trên khớp với bất kỳ chuỗi nào chứa ít nhất một chữ số. Tương tự như biểu thức khớp với bất kỳ chuỗi nào chứa ít nhất một trong ba chữ cái đầu tiên của bảng chữ cái Latinh. Để đại diện cho bất kỳ nhân vật nào, ngoại trừđược chỉ định, mục nhập được sử dụng [^abcdef], tức là với biểu tượng nắp ngay sau dấu ngoặc vuông mở đầu.

Giả sử chúng ta cần kiểm tra xem một chuỗi có chứa bất kỳ ký tự nào của bảng chữ cái Latinh hay không. Việc liệt kê tất cả 26 chữ cái không hoàn toàn thuận tiện phải không? Đặc biệt đối với những trường hợp như vậy trong biểu thức chính quy, bạn có thể sử dụng dấu gạch ngang trong ngoặc vuôngđể biểu thị một tập hợp các ký tự có thứ tự. Sự biểu lộ Bất kỳ chuỗi nào chứa ít nhất một chữ cái viết thường của bảng chữ cái Latinh sẽ khớp. Bằng cách tương tự, ví dụ trước đây với các con số có thể được viết ngắn gọn hơn:

nếu ($văn bản =~ // ) (
# văn bản chứa số
) khác (
# không có số trong văn bản
}

Và một vài ví dụ nữa:

nếu ($văn bản =~ // ) (
# văn bản chứa số và/hoặc chữ thường
# phù hợp: abc, ZZaZZ, ===17
# không phù hợp: THẤT BẠI EPIC, @^*!@#
}

if ($text =~ /[^0-9]/ ) (
# văn bản chứa các ký tự không phải là số
# phù hợp: abc, 123abc456, 0x1111111111
#không phù hợp: 123, 123456, 9999999999
}

nếu ($văn bản =~ // ) (
# văn bản chứa các chữ cái của bảng chữ cái Latinh
#phù hợp: ___Abba___, zyx
#không phù hợp: 0123,^_^
}

nếu ($văn bản =~ // ) (
# văn bản chứa số và chữ cái từ A đến F
# phù hợp: ***777***, DeadC0de, intel, 0_o
# không phù hợp: Xor, wiki
}

Hãy làm phức tạp nhiệm vụ. Bây giờ chúng ta cần kiểm tra không chỉ sự hiện diện hay vắng mặt của một số ký tự nhất định mà còn xem chuỗi có khớp với một định dạng nhất định hay không. Dưới đây là một số ví dụ đơn giản:

if ($text =~ /num=/ ) (
# phù hợp: num=1, some_num=000, bebenum=2(&^*
# không phù hợp: NUM=1, my_num=-1, num=abc
}

nếu ($văn bản =~ / / ) {
# phù hợp:
#zzz zzzz
#
# không phù hợp:
#
#
}

Người đọc chú ý sẽ tự hỏi điều này là gì dấu cộng có trong biểu thức chính quy cuối cùng không? Ký hiệu này có nghĩa là "một hoặc nhiều ký tự được chỉ định trước dấu cộng này". Biểu tượng có nghĩa gần như giống nhau ngôi sao"từ số không tối đa bất kỳ số lượng ký tự nào được chỉ định trước dấu hoa thị.” Ví dụ, biểu thức A+ sẽ khớp với một chuỗi gồm một hoặc nhiều ký tự A và biểu thức * - bất kỳ số chữ số nào, kể cả không có.

Đôi khi số lượng ký tự cần được chỉ định chính xác hơn. Điều này có thể được thực hiện bằng cách sử dụng dấu ngoặc nhọn. Ví dụ, biểu thức {8} khớp với bất kỳ chuỗi nào có chính xác tám chữ số và biểu thức {3,8} - một chuỗi chứa từ 3 đến 8 ký tự của bảng chữ cái Latinh.

Số ở vị trí thứ hai có thể không được chỉ định. Tức là biểu thức {3,} cũng có thể xảy ra. Nó có nghĩa là “ít nhất ba chữ cái viết thường trong bảng chữ cái Latinh”. Sự biểu lộ {0,} hoàn toàn giống với dấu hoa thị và {1,} - thêm. Sự biểu lộ {0,1} có thể được viết ngắn gọn hơn bằng cách sử dụng dấu chấm hỏi.

Ví dụ (không đơn giản nhất nhưng thú vị):

nếu ($văn bản =~ // ) {
# phù hợp:
#dfgd dfgdfg
#
# không phù hợp:
#
#
}

Nếu ví dụ này khiến bạn nhức đầu, đã đến lúc thực hành một chút với các biểu thức chính quy bằng cách viết chương trình kiểm tra. Nếu không, việc đọc thêm sẽ để lại cho bạn một mớ hỗn độn trong đầu. Nếu mọi thứ đều rõ ràng cho đến nay, hãy tiếp tục.

3. Làm thế nào để xé một đoạn dây?

Biểu tượng đường thẳng đứng(còn gọi là "ống" hoặc chỉ "dính") trong biểu thức thông thường có nghĩa là "hoặc". Ví dụ, biểu thức {20}|{25} khớp với tất cả các chuỗi chứa 20 ký tự Latinh hoặc 25 số liên tiếp. Thông thường ký hiệu này được sử dụng cùng với dấu ngoặc đơn, được thiết kế để nhóm các phần của biểu thức chính quy. Ví dụ:

nếu ($tên tệp =~ /sao lưu(19|20)(2)-(2)-(2)/) {
# phù hợp: backup2011-04-01, backup1999-01-13
# không phù hợp: backup1873-12-12, backup2101-07-07
}

Dấu ngoặc đơn có chức năng khác. Với sự giúp đỡ của họ, bạn có thể xé các mảnh của dòng tương ứng. Trong PHP, kết quả được lưu trữ trong biến được chỉ định bởi đối số thứ ba của hàm preg_match. Trong Perl, các cặp dấu ngoặc đơn thứ 1, 2...9 được lưu trữ trong các biến $1, $2,..., $9. Nhưng sẽ thuận tiện hơn khi sử dụng cấu trúc này:

nếu (của tôi ($y, $m, $d) =
$tên tệp =~ /sao lưu((4))-((2))-((2))/) {
in ;
}

Câu hỏi đặt ra là cần tìm số nào khớp trong mảng được trả về nếu biểu thức chính quy chứa lồng vào nhau dấu ngoặc? Thật đơn giản - các kết quả khớp được trả về theo thứ tự giống như dấu ngoặc đơn mở. Ví dụ:

tên tệp $ của tôi = "./dumps/backup2011-04-01.tgz";
$tên tệp =~ /backup((20|19)(2))-((2))-((2))/;
in "$1, $2, $3, $4 \N";
# sẽ xuất ra: 2011, 20, 04, 01

Đôi khi chúng ta muốn nhóm một phần nào đó của biểu thức nhưng không trả lại nó. Để làm điều này, ngay sau dấu ngoặc mở đầu bạn cần viết dãy dấu chấm hỏi và dấu hai chấm. Ví dụ:

nếu (của tôi ($y, $m, $d) =
$tên tệp =~ /backup((?:20|19)(2))-((2))-((2))/) {
in "năm = $y, tháng = $m, ngày = $d\n ";
}

Theo sau dấu ngoặc đơn cũng có thể là dấu chấm hỏi, dấu cộng hoặc dấu hoa thị, cho biết rằng cấu trúc trong dấu ngoặc đơn là tùy chọn, phải được lặp lại hơn 1 lần hoặc phải được lặp lại hơn 0 lần tương ứng. Sử dụng dấu ngoặc nhọn sau dấu ngoặc đơn cũng được chấp nhận.

4. Bắt đầu và kết thúc dòng

Việc chỉ ra trong một biểu thức chính quy nơi chuỗi sẽ bắt đầu và/hoặc kết thúc thường rất hữu ích. Việc đầu tiên được thực hiện bằng cách sử dụng biểu tượng mũ lưỡi traiở đầu biểu thức, biểu thức thứ hai - sử dụng ký hiệu đô la cuối cùng. Ví dụ:

nếu ($văn bản =~ /^*/ ) (
# văn bản bắt đầu bằng chữ số thập phân
#phù hợp: 3, 801403, 6543bebebe
#không phù hợp: 0275, -123, abc11111
}

if ($text =~ /^0x(1,8)$/ ) (
# số thập lục phân trong ký hiệu C
# phù hợp: 0x5f3759df, 0xDEADBEEF
# không phù hợp: 0x1234xxx, xxx0x5678, xxx0x9ABCxxx
}

Không khó phải không? Xin lưu ý rằng khi kiểm tra các trường biểu mẫu web, các đối số hàm trước khi thay thế chúng thành truy vấn SQL, v.v. nhất thiết nên được kiểm tra tất cả chuỗi, như được thực hiện trong biểu thức chính quy cuối cùng.

Ghi chú: Nếu bất cứ ai quan tâm đến những "con số ma thuật" 0x5f3759df và 0xDEADBEEF này là gì, vui lòng tham khảo Wikipedia.

5. Ký tự đặc biệt

Ngoài những ký tự đặc biệt nêu trên cũng cần đặc biệt lưu ý điểm. Ý cô ấy là bất kì ký tự khác với dòng mới. Ví dụ sử dụng:

if (my ($name ) = $arg =~ /^--name=(.+)$/ ) (
in "Xin chào, $name! \N";
}

Theo mặc định, các biểu thức chính quy tạo ra cái được gọi là phân tích tham lam. Nói cách khác, các kết quả khớp có độ dài tối đa được tìm kiếm. Khi chúng ta sử dụng dấu chấm, điều này có thể gây ra vấn đề. Ví dụ: chúng ta cần tách một số văn bản từ hàng trăm trang HTML với nội dung xấp xỉ sau:

<khoảng > Chữ<em > chữ</em> chữ</nhịp> Nguồn: http://site/</nhịp>

Đoạn mã sau sẽ không trả về những gì chúng ta muốn:

# biểu thức chính quy có dấu gạch chéo, vì vậy
# thay vào đó phải sử dụng dấu phân cách khác
(.*)#;
in văn bản $ ;
# sẽ in kết quả khớp dài nhất:
#Chữ chữ văn bảnNguồn: http://site/

Đây là những gì sẽ xảy ra nếu bạn tắt tính năng phân tích cú pháp tham lam (lưu ý dấu chấm hỏi):

của tôi ($text ) = $data =~ m # (.*?)#;
in văn bản $ ;
# sẽ in trận đấu đầu tiên:
#Chữ chữ chữ

Có, các dòng sau cũng làm điều tương tự:

# nhập cảnh thường xuyên...
$văn bản =~ /({4})-({2})-({2})/ ;
# thực chất chỉ là cách viết tắt của toán tử m//
$văn bản =~ m/((4))-((2))-((2))/;
# thay vì gạch chéo bạn có thể sử dụng các dấu ngoặc khác:
$text =~ m ( ([ 0 - 9 ] ( 4 ) ) - ( [ 0 - 9 ] ( 2 ) ) - ( [ 0 - 9 ] ( 2 ) ) ) ;
$văn bản=~ m< ([ 0 - 9 ] { 4 } ) - ([ 0 - 9 ] { 2 } ) - ([ 0 - 9 ] { 2 } ) >;
$text =~ m [ ([ 0 - 9 ] ( 4 ) ) - ( [ 0 - 9 ] ( 2 ) ) - ( [ 0 - 9 ] ( 2 ) ) ] ;
$text =~ m (([ 0 - 9 ] ( 4 ) ) - ( [ 0 - 9 ] ( 2 ) ) - ( [ 0 - 9 ] ( 2 ) ) ) ;
# hoặc thậm chí các ký hiệu như thế này:
$văn bản =~ m ! ([ 0 - 9 ] ( 4 ) ) - ( [ 0 - 9 ] ( 2 ) ) - ( [ 0 - 9 ] ( 2 ) ) !;
$text=~ m | ([ 0 - 9 ] ( 4 ) ) - ( [ 0 - 9 ] ( 2 ) ) - ( [ 0 - 9 ] ( 2 ) ) |;
$văn bản=~ m #({4})-({2})-({2})#;
# cũng như chữ hoa, dấu ngoặc kép, dấu hai chấm, dấu phẩy, dấu chấm, ...

Tại sao cần có nhiều cách để viết biểu thức chính quy? Hãy tưởng tượng rằng biểu thức chứa dấu gạch chéo, dấu chấm, dấu phẩy và các ký hiệu khác nhưng không chứa dấu chấm than. Khi đó, rõ ràng là chúng ta không thể sử dụng dấu gạch chéo, dấu chấm, v.v. để biểu thị phần đầu và phần cuối của một biểu thức chính quy, nhưng chúng ta có thể sử dụng dấu chấm than.

Thông thường trong các biểu thức thông thường bạn phải sử dụng dấu gạch chéo ngược. Được đặt trước dấu chấm, dấu ngoặc đơn, dấu cộng, chữ hoa và các ký hiệu khác, nó có nghĩa là "ký hiệu sau có nghĩa là chính xác là biểu tượng, chứ không phải cái gì khác." Ví dụ: đây là cách xác định phần mở rộng tệp theo tên của nó:

# dấu gạch chéo ngược thoát khỏi dấu chấm
# có nghĩa là dấu chấm, không phải "bất kỳ ký tự nào"
của tôi ($ext ) = $fname =~ /\.(+)$/ ;
in "tên tệp: $fname, phần mở rộng: $ext\n ";

Ngoài ra, dấu gạch chéo ngược được sử dụng trong ký hiệu sau:

  • \t- biểu thị một ký tự tab ( t ab)
  • \r\N- ký tự trả về vận chuyển ( r trả lại) và dòng mới ( N dòng ew)
  • \xNN- ví dụ: khớp một ký tự với mã ASCII NN \x41 tương ứng với chữ in hoa A của bảng chữ cái Latinh
  • \S- khớp với một khoảng trắng ( S tốc độ), tab, dòng mới hoặc xuống dòng
  • \d- có nghĩa là bất kỳ số nào ( d igit), hay chính xác hơn là số được coi là số trong Unicode (xem slide số 102 trong phần trình bày này)
  • \w- có nghĩa là cái gọi là “từ” ( w ord), tương tự

Trong ba biểu thức cuối, viết chữ in hoa có nghĩa là phủ định. Ví dụ, \D tương ứng với biểu thức [^0-9] , \W- sự biểu lộ [^0-9a-zA-Z_], MỘT \S- bất kỳ ký tự "không phải khoảng trắng" nào.

Tất cả các biểu thức "chữ cái" này có thể được sử dụng trong dấu ngoặc vuông. Ví dụ, biểu thức hoàn toàn tương đương .

Những biểu hiện đáng được quan tâm đặc biệt \b\B, nghĩa là ranh giới của một từ (theo cùng nghĩa của “từ” như trong trường hợp của \w) và sự vắng mặt của ranh giới từ tương ứng. Ví dụ, biểu thức Perl\b khớp với chuỗi "perl Rulez!", nhưng không khớp với "perlmonk". Với biểu thức Perl\B mọi thứ hoàn toàn ngược lại. Tôi hy vọng ý tưởng là rõ ràng.

Và một ví dụ nữa:

# chia tên file đầy đủ thành đường dẫn và tên
của tôi ($path , $fname ) = $full_name =~ /^(.*)\/([^\/]+)$/ ;

Nó minh họa việc sử dụng dấu gạch chéo ngược để thoát khỏi một ký tự được dùng để biểu thị ranh giới biểu thức chính quy. Trong ví dụ này nó là dấu gạch chéo về phía trước.

6. Công cụ sửa đổi

Hành vi của biểu thức chính quy có thể được thay đổi bằng cách sử dụng công cụ sửa đổi. Ví dụ: như bạn có thể đã nhận thấy, việc khớp một chuỗi với một biểu thức chính quy được kiểm tra theo cách phân biệt chữ hoa chữ thường. Bạn có thể thay đổi hành vi này bằng cách sử dụng công cụ sửa đổi # (.*?)#g;
# hãy cẩn thận khi sử dụng /g trong ngữ cảnh vô hướng
# chi tiết tại đây: http://koorchik.blogspot.com/2011/07/perl-5.html
in "$_ \N" cho (@words) ;

Như đã nêu ở trên, dấu chấm biểu thị bất kỳ ký tự nào ngoại trừ ký tự dòng mới. Bạn có thể thay đổi hành vi này bằng cách sử dụng công cụ sửa đổi /S:

# trích xuất nội dung bài viết từ file HTML,
# có thể chứa nhiều hơn một hoặc hai dòng
($bài viết) của tôi = $html =~ m #

(.*?)
#S;

Nhân tiện, nếu trong một biểu thức chính quy, bạn cần chỉ ra “bất kỳ ký tự nào” mà không cần sử dụng từ bổ nghĩa /S, sử dụng biểu thức [\d\D]. Nó có nghĩa là “bất kỳ ký tự nào là chữ số hoặc không phải là chữ số”, tức là bất kỳ ký tự nào.

Cuối cùng, không có gì ngăn cản bạn sử dụng nhiều công cụ sửa đổi cùng một lúc:

# tách ra mọi thứ in đậm từ tệp HTML
@words của tôi = $html =~ m # (.*?)#gi;
# sẽ làm việc cho , hoặc thậm chí

Phép cộng: Một công cụ sửa đổi hữu ích khác là /o. Nó có nghĩa là "chỉ biên dịch biểu thức chính quy một lần." TRONG một số Trong trường hợp, công cụ sửa đổi này có thể tăng tốc đáng kể tập lệnh. Tuy nhiên, tôi không chắc liệu nó có được hỗ trợ ở bất kỳ đâu ngoại trừ Perl. Cảm ơn lời khuyên của đồng chí

Bí mật của biểu thức chính quy

Phần 1. Phương ngữ và khả năng. Viết biểu thức chính quy

Chuỗi nội dung:

1. Giới thiệu. Chúng ta có đang sử dụng hết tiềm năng của biểu thức chính quy không?

Nếu bạn nghĩ về câu hỏi: “Nói chung, “biểu thức chính quy” là gì?”, thì câu trả lời sẽ không được tìm thấy ngay lập tức. Có thể nói đây là ngôn ngữ chuyên dùng để mô tả mẫu ký tự (chuỗi ký tự) phục vụ tìm kiếm trong chuỗi văn bản. Điều quan trọng ở đây là khi tìm kiếm kết quả trùng khớp, việc so sánh từng ký tự được thực hiện. J.E.F. Friedl, tác giả cuốn bách khoa toàn thư về biểu thức chính quy (Mastering Regular Expressions), khuyên bạn nên phát triển thói quen diễn giải biểu thức chính quy theo nghĩa đen. Ví dụ: khi nhìn vào mẫu "^cat", có nghĩa là "dòng phải bắt đầu bằng từ cat", người ta sẽ lý luận như sau: "sẽ tìm thấy kết quả trùng khớp nếu chúng ta ở đầu dòng và tìm thấy ngay sau ký tự c là ký tự a, ngay sau đó là ký hiệu t”. Điều này cho phép bạn đánh giá chính xác nhất ý nghĩa và bản chất của biểu thức chính quy.

Hầu hết người dùng đều biết rằng để tìm kiếm, chỉ cần nhập một từ mẫu. Ví dụ: trong trình duyệt Web, trong trường "Tìm kiếm", sau khi nhập "Linux", bạn sẽ nhận được một danh sách dài các liên kết đến các trang có văn bản khớp với mẫu "Linux" đã chỉ định. Trên hệ thống tệp cục bộ, sử dụng lệnh grep "Linux" hoặc các công cụ tìm kiếm đồ họa.

Không phải tất cả, nhưng nhiều người dùng biết cách sử dụng siêu ký tự (* . ?) trong các mẫu tìm kiếm. Thậm chí còn ít người biết về khả năng sử dụng các công cụ sửa đổi và các công cụ phức tạp khác để xây dựng các biểu thức chính quy, tức là trong nhiều trường hợp, chỉ một phần ba công suất của công cụ biểu thức chính quy được sử dụng. Tại sao không thử tăng hiệu quả?

2. Các phương ngữ khác nhau của biểu thức chính quy. Tuân thủ POSIX

Nói chung, có hai phương ngữ (hoặc loại) chính của biểu thức chính quy: đơn giản và mở rộng. Đồng thời, ranh giới giữa chúng có điều kiện và ngày càng trở nên mờ nhạt theo thời gian.

Các chương trình vi(m), sed, grep, less, ed, expr, lex chỉ hiểu các biểu thức chính quy đơn giản, trong khi các tiện ích (g)awk, egrep, cũng như các trình thông dịch của các ngôn ngữ Perl, Tcl, Python, hiểu các biểu thức chính quy mở rộng. biểu thức. Đồng thời, mỗi chương trình đều có những cải tiến riêng, tức là. các phương ngữ phụ của biểu thức chính quy được tạo ra. Chúng ta hãy xem xét những điểm tương đồng và khác biệt giữa các phương ngữ này.

2.1. Lược đồ biểu thức chính quy chung

Thông thường, một biểu thức chính quy bao gồm ba phần chính:

  1. Anchor – xác định vị trí của mẫu trong một dòng văn bản:
    • ^ – mỏ neo xác định điểm bắt đầu của dòng;
    • $ là một mỏ neo xác định điểm cuối của dòng.
  2. Một tập hợp (chuỗi) ký tự – để tìm kiếm các kết quả khớp ở các vị trí nhất định của một dòng văn bản:
    • ký tự dấu chấm (.) khớp với bất kỳ ký tự tùy ý nào;
    • ký tự chữ và số và dấu cách thể hiện chính chúng;
    • các ký hiệu khác - giải thích tùy thuộc vào phương ngữ.
  3. Công cụ sửa đổi - đặt số lần lặp lại của ký tự hoặc bộ ký tự trước đó (tùy thuộc vào phương ngữ):
    • * – bất kỳ số lần lặp lại nào của một ký tự/bộ, bao gồm cả số 0;
    • ? – khớp với 0 hoặc một phiên bản của ký tự/bộ;
    • + – khớp với một hoặc nhiều phiên bản của một ký tự/bộ.

Ví dụ: bạn cần tìm tất cả các lệnh xác định hằng số macro trong mã nguồn C.

grep "^ *#define.*" *.c *.h

Ở đây cần tính đến việc có thể chèn bất kỳ số lượng khoảng trắng hoặc không có khoảng trắng nào vào đầu dòng định nghĩa macro. Phần #define của mẫu có nghĩa đen, tức là mỗi ký tự được hiểu là "nguyên trạng". Phần cuối cùng của mẫu có nghĩa là "bất kỳ ký hiệu nào với số lượng bất kỳ".

Lưu ý rằng ký tự ^ chỉ được hiểu là một mỏ neo đánh dấu sự bắt đầu của một dòng nếu đó là ký tự đầu tiên của mẫu. Tương tự, ký tự $ đánh dấu sự kết thúc của một dòng, với điều kiện đó là ký tự cuối cùng của mẫu. Trong tất cả các trường hợp khác, các ký hiệu này trở thành chữ, tức là đại diện cho chính họ.

2.2. Xác định phạm vi ký tự trong biểu thức chính quy

Nếu có nhu cầu chỉ định một ký tự từ một nhóm nhất định, chẳng hạn như chỉ một ký tự số hoặc chỉ một nguyên âm viết thường hoặc chỉ các ký hiệu dấu chấm câu, thì dấu ngoặc vuông sẽ được sử dụng, trong đó các ký tự bắt buộc được xác định. Như vậy:

  • – tương ứng với một ký tự số từ một bộ nhất định;
  • [аееоуыеюя] – tương ứng với một trong các nguyên âm được liệt kê;
  • [,.:;] – khớp với một trong các ký hiệu dấu câu.

Xin lưu ý rằng trong trường hợp sau, dấu chấm trong ngoặc vuông sẽ mất trạng thái đặc biệt và không biểu thị “bất kỳ ký tự nào” mà là chính ký tự “dấu chấm”.

Các dãy ký tự liên tục có thể được viết ở dạng rút gọn bằng cách sử dụng dấu gạch nối: ví dụ đầu tiên được viết thuận tiện hơn là . Ngoài ra, mọi sự kết hợp giữa phạm vi và ký tự cụ thể đều được cho phép.

Cũng có thể loại trừ các bộ ký tự được chỉ định khỏi tìm kiếm, việc này được thực hiện như sau:

  • [^0-9] – khớp với bất kỳ ký tự nào ngoại trừ số;
  • [^аеойоуыеюя] – khớp với bất kỳ chữ cái nào KHÔNG phải là nguyên âm.

Chúng ta sẽ làm quen với các sắc thái khác của việc xác định phạm vi ký tự trong dấu ngoặc vuông trong quá trình áp dụng chúng và bây giờ chúng ta sẽ xem xét các công cụ sửa đổi bằng cách sử dụng ví dụ về mẫu tìm kiếm địa chỉ IP kỹ thuật số.

2.3. Công cụ sửa đổi số lần lặp lại ký tự

Khó khăn ở đây là công cụ sửa đổi * không phù hợp để tìm kiếm địa chỉ IP - cố gắng sử dụng mẫu *\.*\.*\. sẽ dẫn đến các dòng chứa các phần tử thuộc loại 2344.5657.11.00000, không phải là địa chỉ IP. Để chỉ định số lần lặp lại của bộ ký tự, công cụ sửa đổi \(min,max\) được sử dụng. Biết rằng mỗi phần của địa chỉ IP có thể chứa từ một đến ba chữ số, chúng ta sẽ viết từ bổ nghĩa ở dạng \(1,3\). Cần có các ký tự dấu gạch chéo ngược trước dấu chấm để ghi đè trạng thái đặc biệt của chúng dưới dạng siêu ký tự đại diện. Cũng lưu ý rằng giá trị 0 không được sử dụng làm byte đầu tiên của địa chỉ IP thông thường. Kết quả là chúng ta có được mẫu tìm kiếm sau:

grep "\(0,2\)\.\(1,3\)\.\(1,3\)\.\(1,3\)" *.txt

Công cụ sửa đổi \(min,max\) chỉ hoạt động trong các biểu thức chính quy đơn giản. Bạn không thể sử dụng \( \) trong các biểu thức chính quy mở rộng, nhưng bạn có thể sử dụng công cụ sửa đổi? tương đương với biểu thức \(0,1\) và sửa đổi + tương đương với biểu thức \(1,\). Trong trường hợp thứ hai, không có giá trị số nào sau dấu thập phân - điều này có nghĩa là số lượng kết quả khớp tối đa không bị giới hạn.

2.4. Ghi nhớ và sử dụng lại một phần tử mẫu

Cơ chế này cũng chỉ hoạt động trong các biểu thức chính quy đơn giản. (Tuy nhiên, trong các ngôn ngữ lập trình Perl, Python, v.v., cơ chế này được hỗ trợ - ranh giới giữa các phương ngữ ngày càng khó phân biệt, bạn nhớ không?)

Trong các biểu thức chính quy đơn giản, các phần của mẫu có trong cấu trúc \(\) được ghi nhớ và đánh số, sau đó chúng có thể được sử dụng lại. Tổng cộng, bạn có thể ghi nhớ tối đa chín mẫu được đánh số. Ví dụ minh họa nhất về việc sử dụng cơ chế ghi nhớ là tìm kiếm các bảng màu (các từ được đọc giống nhau từ trái sang phải và từ phải sang trái):

  • \(\)\(\)\2\1 – đối với các bảng màu gồm năm chữ cái (ví dụ: cấp độ, rôto, madam, v.v.)
  • \(\)\(\)\(\)\3\2\1 – đối với các bảng màu sáu chữ cái (ví dụ: redder, succus, terret, v.v.)

2.5. Tuân thủ POSIX

Tiêu chuẩn POSIX cũng chia biểu thức chính quy thành hai loại: BRE (Biểu thức chính quy cơ bản) và ERE (Biểu thức chính quy mở rộng). Siêu ký tự được hỗ trợ trong cả hai loại. và *, neo ^ và $, nhóm các ký tự trong dấu ngoặc đơn (đối với BRE, dấu ngoặc đơn được thoát bằng dấu gạch chéo ngược), áp dụng bộ định lượng \(min,max\) cho các nhóm trong dấu ngoặc đơn. Việc ghi nhớ và sử dụng lại \1...\9 chỉ được hỗ trợ bởi danh mục BRE và các bộ định lượng + và? và cấu trúc lựa chọn – chỉ loại ERE.

Tiêu chuẩn POSIX sử dụng khái niệm bối cảnh cục bộ (locale) - một tập hợp các tham số mô tả các quy tắc ngôn ngữ và văn hóa: định dạng ngày giờ, giải thích các ký tự mã hóa hoạt động, v.v. Điều này không áp dụng trực tiếp cho các biểu thức chính quy nhưng nó ảnh hưởng đến cách chúng hoạt động. Khi làm việc trong bối cảnh cục bộ với mã hóa UTF-8, được áp dụng trong hầu hết các bản phân phối hiện đại, các ký tự trong bảng chữ cái tiếng Nga và phạm vi của chúng được xử lý chính xác, tức là. Bạn có thể chỉ định phạm vi [a-z] và [A-Z] trong mẫu tìm kiếm.

3. Ví dụ về cách soạn các biểu thức chính quy hữu ích

Để tạo ra các biểu thức chính quy hoạt động chính xác, chỉ lý thuyết thôi là chưa đủ. Cần phải học không chỉ cách xây dựng và viết một mẫu mà còn phải tính đến đầy đủ bối cảnh mà nó sẽ được so sánh. Viết và cải tiến một mẫu là một quá trình lặp đi lặp lại, trong đó hai nhiệm vụ chính được giải quyết: một mặt, có được tất cả các dòng cần thiết, không bỏ sót những dòng mà lẽ ra phải khớp, theo kế hoạch, nhưng vì lý do nào đó đã không phù hợp. cuộc thi đấu; mặt khác, loại trừ tất cả những dòng không cần thiết, kể cả những dòng mà theo kế hoạch nên bỏ đi nhưng vì lý do nào đó lại trùng khớp.

3.1. Ví dụ về mẫu tìm kiếm số tiền được viết ở định dạng "10.000 rúp 00 kopecks."

\(1,\) chà\. \(2\) kopecks\.

Cần phải làm rõ: nếu một công cụ sửa đổi như \(min,max\) thiếu cả dấu phẩy và giá trị tối đa thì cấu trúc này chỉ định chính xác số lần lặp lại dự kiến ​​của phần tử mẫu. Trong ví dụ của chúng tôi, chính xác hai ký tự số được xác định để biểu thị kopecks.

3.2. Ví dụ về mẫu tìm kiếm chuỗi URL tương ứng với tài nguyên Web trên Internet:

http://\(1,\)\.[-a-zA-Z0-9_]\(1,\)/*

Cần phải làm rõ: dấu gạch nối sẽ mất ý nghĩa đặc biệt nếu nó được chỉ định ở vị trí đầu tiên ngay sau dấu ngoặc vuông mở trong một phạm vi. Mẫu này cũng có thể được sử dụng để tìm các chuỗi URL “kỳ lạ”, chẳng hạn như http://my.home-server/

Ở định dạng biểu thức chính quy mở rộng, mẫu này có thể được viết gọn hơn:

http://+\.[-a-zA-Z0-9_]+/*

Ký hiệu này được hiểu bởi các tiện ích egrep và awk.

3.3. Mẫu tìm kiếm bất kỳ thẻ HTML nào trông đơn giản đến mức đáng ngạc nhiên:

<[^>]+>

Khớp với bất kỳ chuỗi ký tự nào ngoại trừ một hoặc nhiều > được đặt trong dấu ngoặc nhọn. Nói cách khác, một thẻ ký tự đơn cũng sẽ được tìm thấy

Và nhiều thẻ dài dòng hơn như


.

3.4. Tùy chọn mẫu để tìm kiếm ngày

Biểu thức chính quy nâng cao cho phép bạn viết một mẫu hơi phức tạp nhưng vẫn hoạt động chính xác để tìm kiếm những ngày giống như “ngày 13 tháng 11 năm 2009”:

? (Tháng 1|Tháng 2|Tháng 3|Tháng 4|Tháng 5|Tháng 6|Tháng 7|Tháng 8|Tháng 9|Tháng 10|Tháng 11|Tháng 12).* g\.

Điểm bất lợi của mẫu này là không thể sử dụng nó để tìm ngày tháng trong lịch sử cổ đại, ví dụ: "13 tháng 11 năm 245". hoặc ngày 1 tháng 1 năm 88,” nhưng nó khá phù hợp để làm việc với các tài liệu hiện đại (có tính đến bối cảnh tìm kiếm!).

3.5. Ứng dụng thực tế của các phần được đánh số của mẫu

Trong phần trước, tôi đã đưa ra ví dụ về mẫu tìm kiếm palindromes. Chức năng của nó cũng có thể được cải thiện đôi chút bằng cách viết lại biểu thức như sau:

\(.\)\(.\)\(.\)\3\2\1

Bằng cách sử dụng mẫu này, bạn có thể tìm thấy các bảng màu sáu ký tự không chỉ bằng tiếng Anh mà còn bằng tiếng Nga và bất kỳ ngôn ngữ nào khác, cũng như các chuỗi ký tự không phải chữ cái, chẳng hạn như /*!!*/

Một cách thực tế hơn để sử dụng các phần được ghi nhớ và đánh số của mẫu là tìm kiếm các từ lặp lại gần đó, điều này cho phép bạn phát hiện các lỗi phổ biến (lỗi chính tả) trong văn bản như “for for”. Mẫu có thể được viết như thế này:

\<\(..*\)\> \<\1\>

Hai phần tử biểu thức chính quy khác được sử dụng ở đây: \< для обозначения начальной границы слова и \>để chỉ ra ranh giới cuối cùng của một từ. Vì vậy, chúng ta chỉ nhớ từng từ riêng lẻ chứ không nhớ bất kỳ chuỗi ký tự nào. Biểu thức ..* khớp với bất kỳ từ nào có ít nhất một ký tự. Kết quả là chúng ta sẽ có thể tìm thấy các lỗi chính tả lặp lại như “và”, “not not”, “for for”, v.v.

3.6. Giới hạn kích thước của phần phù hợp của mẫu

Một đặc điểm khác về “đặc điểm” của các biểu thức chính quy là chúng cực kỳ “tham lam”, tức là. cố gắng nối một chuỗi càng dài càng tốt. Vì sự “tham lam” này mà những vấn đề bất ngờ có thể nảy sinh. Ví dụ: có một mẫu để tìm kiếm bất kỳ số lượng ký tự nào được đặt trong dấu ngoặc kép:

".*"

Chuỗi tìm kiếm trông như thế này:

"Petrov" "nhân viên bảo vệ" "Ivanov" "bộ phận cung ứng" "người giao nhận" "Sidorov" "hành chính" "giám đốc"

Nếu nhiệm vụ chỉ trích xuất đối số đầu tiên (họ của nhân viên) từ các chuỗi đã cho thì mẫu được đề xuất ở trên sẽ không thực hiện chính xác, vì trích dẫn thứ hai của mẫu khớp với trích dẫn cuối cùng của chuỗi (do mong muốn để có được kết quả phù hợp tối đa). Thay đổi mẫu:

".*" ".*"

chỉ giải quyết vấn đề ở dòng đầu tiên, còn ở dòng thứ hai và thứ ba, nơi làm việc cũng được gắn với họ - một lần nữa, không phải thứ chúng ta cần!

Vấn đề này có thể được giải quyết một cách chính xác bằng cách sử dụng biểu thức chính quy khớp với đoạn chuỗi ngắn nhất có thể, nằm giữa hai dấu ngoặc kép:

"[^"]*"

Ở đây, dấu ngoặc kép mở đầu phải được theo sau bởi bất kỳ số lượng ký tự không phải dấu ngoặc kép nào cho đến khi gặp dấu ngoặc kép kết thúc.

4. Kết luận

Ngay cả từ những ví dụ không hề phức tạp nhất được mô tả trong bài viết này, bạn có thể hiểu các biểu thức chính quy có khả năng phong phú và đa dạng như thế nào. Bạn thậm chí có thể coi định dạng ghi lại các mẫu của chúng như một loại ngôn ngữ lập trình, học cách suy nghĩ và viết, trong đó bạn sẽ tự cứu mình khỏi rất nhiều công việc đơn điệu và tẻ nhạt.

Bài viết đầu tiên đưa ra ý tưởng chung về các biểu thức chính quy và phạm vi của chúng, cũng như tổng quan ngắn gọn về các đặc điểm của phương ngữ của chúng. Ví dụ về việc soạn các biểu thức chính quy để giải quyết các vấn đề khác nhau đã được xem xét.

Phần tiếp theo của loạt bài sẽ tập trung vào công việc thực tế với các biểu thức chính quy trong các chương trình và môi trường ngôn ngữ cụ thể.

Tài nguyên để tải xuống

static.content.url=http://www.site/developerworks/js/artrated/

Bài viếtID=487264

ArticleTitle=Bí mật của biểu thức chính quy: Phần 1. Phương ngữ và khả năng. Viết biểu thức chính quy