Khái niệm cơ bản về biểu thức chính quy trong C ++

Regular Expression Basics C



Hãy xem xét câu sau trong dấu ngoặc kép:

'Người đàn ông của tôi đây.'

Chuỗi này có thể nằm bên trong máy tính và người dùng có thể muốn biết nếu nó có từ man. Nếu nó có từ đàn ông, thì anh ta có thể muốn đổi từ đàn ông thành phụ nữ; để chuỗi sẽ đọc:







'Người phụ nữ của tôi đây.'

Có nhiều mong muốn khác như thế này từ người sử dụng máy tính; một số phức tạp. Biểu thức chính quy, viết tắt, regex, là đối tượng xử lý các vấn đề này bằng máy tính. C ++ đi kèm với một thư viện gọi là regex. Vì vậy, một chương trình C ++ để xử lý regex nên bắt đầu bằng:



#bao gồm

#bao gồm

sử dụng không gian tên std;

Bài viết này giải thích Khái niệm cơ bản về biểu thức chính quy trong C ++.



Nội dung bài viết

Các nguyên tắc cơ bản về biểu thức chính quy

Regex

Một chuỗi như Đây là người đàn ông của tôi. ở trên là chuỗi mục tiêu hoặc chuỗi mục tiêu hoặc đơn giản là mục tiêu. man, được tìm kiếm, là biểu thức chính quy, hay đơn giản hơn, là regex.





Phù hợp

So khớp được cho là xảy ra khi từ hoặc cụm từ đang được tìm kiếm được định vị. Sau khi khớp, quá trình thay thế có thể diễn ra. Ví dụ, sau khi người đàn ông nằm ở trên, nó có thể được thay thế bằng người phụ nữ.

Kết hợp đơn giản

Chương trình sau đây cho biết cách ghép từ người đàn ông.



#bao gồm

#bao gồm

sử dụng không gian tên std;

NSchủ chốt()
{

regex reg('Đàn ông');
nếu như (regex_search('Người đàn ông của tôi đây.',reg))
Giá cả<< 'phù hợp' <<endl;
khác
Giá cả<< 'không phù hợp' <<endl;

trở lại 0;
}

Hàm regex_search () trả về true nếu có khớp và trả về false nếu không có khớp nào xảy ra. Ở đây, hàm nhận hai đối số: đối số đầu tiên là chuỗi đích và đối số thứ hai là đối tượng regex. Bản thân regex là 'man', trong dấu ngoặc kép. Câu lệnh đầu tiên trong hàm main () tạo thành đối tượng regex. Regex là một kiểu và reg là đối tượng regex. Đầu ra của chương trình ở trên là 'khớp', vì 'người đàn ông' được nhìn thấy trong chuỗi đích. Nếu 'người đàn ông' không được nhìn thấy trong mục tiêu, regex_search () sẽ trả về false và kết quả đầu ra sẽ là 'không khớp'.

Đầu ra của mã sau không khớp:

regex reg('Đàn ông');
nếu như (regex_search('Đây là sản phẩm của tôi.',reg))
Giá cả<< 'phù hợp' <<endl;
khác
Giá cả<< 'không phù hợp' <<endl;

Không khớp vì không thể tìm thấy regex 'man' trong toàn bộ chuỗi mục tiêu, 'Đây là sản phẩm của tôi.'

Mẫu

Biểu thức chính quy, man ở trên, rất đơn giản. Regexes thường không đơn giản như vậy. Biểu thức chính quy có siêu ký tự. Metacharacters là những ký tự có ý nghĩa đặc biệt. Siêu ký tự là một ký tự về các ký tự. Các siêu ký tự regex của C ++ là:

^$ .* + ? ( ) [ ] { } |

Một regex, có hoặc không có siêu ký tự, là một mẫu.

Các lớp nhân vật

Dấu ngoặc vuông

Một mẫu có thể có các ký tự trong dấu ngoặc vuông. Với điều này, một vị trí cụ thể trong chuỗi đích sẽ khớp với bất kỳ ký tự nào trong dấu ngoặc vuông. Hãy xem xét các mục tiêu sau:

'Con mèo đang ở trong phòng.'

'Con dơi đang ở trong phòng.'

'Con chuột đang ở trong phòng.'

Regex, [cbr] at sẽ khớp với con mèo ở mục tiêu đầu tiên. Nó sẽ khớp với dơi trong mục tiêu thứ hai. Nó sẽ khớp với con chuột trong mục tiêu thứ ba. Điều này là do, mèo hoặc dơi hoặc chuột bắt đầu bằng ‘c’ hoặc ‘b’ hoặc ‘r’. Đoạn mã sau minh họa điều này:

regex reg('[cbr] lúc');
nếu như (regex_search('Con mèo đang ở trong phòng.',reg))
Giá cả<< 'phù hợp' <<endl;
nếu như (regex_search('Con dơi đang ở trong phòng.',reg))
Giá cả<< 'phù hợp' <<endl;
nếu như (regex_search('Con chuột đang ở trong phòng.',reg))
Giá cả<< 'phù hợp' <<endl;

Đầu ra là:

phù hợp

phù hợp

phù hợp

Phạm vi ký tự

Lớp, [cbr] trong mẫu [cbr], sẽ khớp với một số ký tự có thể có trong mục tiêu. Nó sẽ khớp với ‘c’ hoặc ‘b’ hoặc ‘r’ trong mục tiêu. Nếu mục tiêu không có bất kỳ ký tự nào trong số ‘c’ hoặc ‘b’ hoặc ‘r’, theo sau là tại, sẽ không có kết quả phù hợp.

Một số khả năng như ‘c’ hoặc ‘b’ hoặc ‘r’ tồn tại trong một phạm vi. Phạm vi các chữ số, từ 0 đến 9 có 10 khả năng và mô hình cho điều đó là [0-9]. Phạm vi các bảng chữ cái viết thường, từ a đến z, có 26 khả năng và mẫu cho điều đó là [a-z]. Phạm vi bảng chữ cái viết hoa, từ A đến Z, có 26 khả năng và mẫu cho đó là [A-Z]. - không chính thức là một siêu ký tự, nhưng trong dấu ngoặc vuông, nó sẽ biểu thị một phạm vi. Vì vậy, điều sau đây tạo ra một kết quả phù hợp:

nếu như (regex_search('ID6id',regex('[0-9]')))

Giá cả<< 'phù hợp' <<endl;

Lưu ý cách regex đã được xây dựng như là đối số thứ hai. Sự trùng khớp xảy ra giữa chữ số, 6 trong phạm vi, 0 đến 9 và 6 trong mục tiêu, ID6id. Đoạn mã trên tương đương với:

nếu như (regex_search('ID6id',regex('[0123456789]')))

Giá cả<< 'phù hợp' <<endl;

Đoạn mã sau tạo ra một kết quả phù hợp:

charP[] = 'ID6iE';

nếu như (regex_search(P,regex('[a-z]')))

Giá cả<< 'phù hợp' <<endl;

Lưu ý rằng đối số đầu tiên ở đây là một biến chuỗi chứ không phải là chuỗi ký tự. Sự trùng khớp giữa ‘i’ trong [a-z] và ‘i’ trong ID6iE.

Đừng quên rằng một phạm vi là một lớp. Có thể có văn bản ở bên phải phạm vi hoặc bên trái phạm vi trong mẫu. Đoạn mã sau tạo ra một kết quả phù hợp:

nếu như (regex_search('ID2id là một ID ',regex('ID [0-9] id')))

Giá cả<< 'phù hợp' <<endl;

Sự trùng khớp giữa id ID [0-9] và ID2id. Phần còn lại của chuỗi đích, là một ID, không khớp trong trường hợp này.

Như được sử dụng trong chủ đề biểu thức chính quy (regexes), lớp từ thực sự có nghĩa là một tập hợp. Đó là, một trong những nhân vật trong bộ là để phù hợp.

Lưu ý: Dấu gạch nối - là một ký tự siêu chỉ nằm trong dấu ngoặc vuông, cho biết một phạm vi. Nó không phải là một siêu ký tự trong regex, bên ngoài dấu ngoặc vuông.

Phủ định

Một lớp bao gồm một phạm vi có thể bị phủ định. Có nghĩa là, các ký tự không trong tập hợp (lớp) phải khớp với nhau. Điều này được biểu thị bằng ^ siêu ký tự ở đầu mẫu lớp, ngay sau dấu ngoặc vuông mở. Vì vậy, [^ 0-9] có nghĩa là khớp ký tự ở vị trí thích hợp trong mục tiêu, không phải là bất kỳ ký tự nào trong phạm vi, bao gồm từ 0 đến 9. Vì vậy, mã sau sẽ không tạo ra một kết quả phù hợp:

nếu như (regex_search('0123456789101112',regex('[^ 0-9]')))

Giá cả<< 'phù hợp' <<endl;

khác

Giá cả<< 'không phù hợp' <<endl;

Một chữ số trong phạm vi từ 0 đến 9 có thể được tìm thấy ở bất kỳ vị trí chuỗi mục tiêu nào, 0123456789101112 ,; vì vậy không có đối sánh - phủ định.

Đoạn mã sau tạo ra một kết quả phù hợp:

nếu như (regex_search('ABCDEFGHIJ',regex('[^ 0-9]')))

Giá cả<< 'phù hợp' <<endl;

Không tìm thấy chữ số nào trong mục tiêu, ABCDEFGHIJ,; vì vậy có một trận đấu.

[a-z] là một phạm vi nằm ngoài [^ a-z]. Và vì vậy [^ a-z] là phủ định của [a-z].

[A-Z] là một phạm vi nằm ngoài [^ A-Z]. Và vì vậy [^ A-Z] là phủ định của [A-Z].

Các phủ định khác tồn tại.

Khớp khoảng trắng

‘’ Hoặc t hoặc r hoặc n hoặc f là một ký tự khoảng trắng. Trong đoạn mã sau, regex, n khớp với ‘ n’ trong mục tiêu:

nếu như (regex_search('Của dòng một.NS Của dòng hai. ',regex(' ')))

Giá cả<< 'phù hợp' <<endl;

Khớp với bất kỳ ký tự khoảng trắng nào

Mẫu hoặc lớp để khớp với bất kỳ ký tự khoảng trắng nào là, [ t r n f]. Trong đoạn mã sau, ‘’ được khớp:

nếu như (regex_search('một hai',regex('[NSNS NS] ')))

Giá cả<< 'phù hợp' <<endl;

Khớp với bất kỳ ký tự không có khoảng trắng nào

Mẫu hoặc lớp để khớp với bất kỳ ký tự khoảng trắng nào là, [^ t r n f]. Đoạn mã sau tạo ra một kết quả khớp vì không có khoảng trắng trong đích:

nếu như (regex_search('1234abcd',regex('[^NSNS NS] ')))

Giá cả<< 'phù hợp' <<endl;

Dấu chấm (.) Trong Mẫu

Dấu chấm (.) Trong mẫu khớp với bất kỳ ký tự nào bao gồm chính nó, ngoại trừ n, trong mục tiêu. Một kết quả phù hợp được tạo trong đoạn mã sau:

nếu như (regex_search('1234abcd',regex('.')))

Giá cả<< 'phù hợp' <<endl;

Không có kết quả phù hợp nào trong mã sau vì mục tiêu là n.

nếu như (regex_search(' ',regex('.')))

Giá cả<< 'phù hợp' <<endl;

khác

Giá cả<< 'không phù hợp' <<endl;

Lưu ý: Bên trong một lớp ký tự có dấu ngoặc vuông, dấu chấm không có ý nghĩa đặc biệt.

Lặp lại phù hợp

Một ký tự hoặc một nhóm ký tự có thể xuất hiện nhiều lần trong chuỗi mục tiêu. Một mẫu có thể phù hợp với sự lặp lại này. Các siêu ký tự,?, *, +, Và {} được sử dụng để khớp với sự lặp lại trong mục tiêu. Nếu x là một ký tự quan tâm trong chuỗi mục tiêu, thì ký tự siêu có ý nghĩa sau:

NS*:có nghĩa là phù hợp'NS' 0hoặc nhiều lần,tôi..,bất kỳ số lần nào

NS+:có nghĩa là phù hợp'NS' 1hoặc nhiều lần,tôi..,ít nhất một lần

NS? :có nghĩa là phù hợp'NS' 0hoặc1 thời gian

NS{n,}:có nghĩa là phù hợp'NS'ít nhất n lần trở lên.Ghi chúdấu phẩy.

NS{n} :trận đấu'NS'chính xác n lần

NS{n,NS}:trận đấu'NS'ít nhất n lần,nhưng không quá m lần.

Các siêu ký tự này được gọi là bộ định lượng.

Hình minh họa

*

Dấu * khớp với ký tự đứng trước hoặc nhóm đứng trước, không hoặc nhiều lần. o * khớp với ‘o’ trong dog của chuỗi đích. Nó cũng phù hợp với oo trong sách và nhìn. Các regex, o * khớp với boooo trong The animal booooed .. Lưu ý: o * khớp với đào, trong đó ‘o’ xảy ra bằng 0 (hoặc nhiều hơn) thời gian.

+

Dấu + khớp với ký tự đứng trước hoặc nhóm đứng trước, 1 hoặc nhiều lần. Đối chiếu nó với 0 hoặc nhiều lần hơn cho *. Vì vậy, regex, e + khớp với ‘e’ trong eat, trong đó ‘e’ xuất hiện một lần. e + cũng khớp với ee trong cừu, trong đó ‘e’ xuất hiện nhiều hơn một lần. Lưu ý: e + sẽ không khớp với dig vì trong dig, ‘e’ không xuất hiện ít nhất một lần.

?

Các ? khớp với ký tự đứng trước hoặc nhóm trước, 0 hoặc 1 lần (và không nhiều hơn). Vì vậy, e? khớp với đào vì ‘e’ xuất hiện trong đào, thời gian bằng không. e? so khớp được đặt vì ‘e’ xuất hiện trong tập hợp, một lần. Lưu ý: e? vẫn khớp với cừu; mặc dù có hai chữ ‘e’s in cừu. Có một sắc thái ở đây - xem sau.

{n,}

Điều này khớp với ít nhất n lần lặp lại liên tiếp của một ký tự đứng trước hoặc nhóm đứng trước. Vì vậy, regex, e {2,} khớp với hai chữ ‘e trong mục tiêu, cừu và ba chữ‘ e trong mục tiêu Sheeep. e {2,} không khớp với tập hợp, vì tập hợp chỉ có một chữ ‘e’.

{n}

Điều này khớp chính xác n lần lặp lại liên tiếp của một ký tự đứng trước hoặc nhóm trước đó. Vì vậy, regex, e {2} khớp với hai chữ ‘e trong mục tiêu, cừu. e {2} không khớp với tập hợp vì tập hợp chỉ có một chữ ‘e’. Chà, e {2} khớp với hai chữ ‘e’s in the target, sheeep. Có một sắc thái ở đây - xem sau.

{n, m}

Điều này khớp với một số lần lặp lại liên tiếp của một ký tự đứng trước hoặc nhóm đứng trước, ở bất kỳ đâu từ n đến m, bao gồm cả. Vì vậy, e {1,3} không khớp với hàm đào nào, không khớp với chữ 'e'. Nó khớp với một chữ ‘e’ trong bộ, hai chữ ‘e’s in cừu, ba chữ‘ e’s in sheeep và ba chữ ‘e’s in sheeeep. Có một sắc thái ở trận đấu cuối cùng - xem sau.

Thay thế phù hợp

Hãy xem xét chuỗi mục tiêu sau trong máy tính.

Trang trại có những con lợn với nhiều kích cỡ khác nhau.

Người lập trình có thể muốn biết mục tiêu này có dê hay thỏ hoặc lợn hay không. Mã sẽ như sau:

charP[] = 'Trang trại có những con lợn với nhiều kích cỡ khác nhau.';

nếu như (regex_search(P,regex('dê | thỏ | lợn')))

Giá cả<< 'phù hợp' <<endl;

khác

Giá cả<< 'không phù hợp' <<endl;

Mã tạo ra một kết quả phù hợp. Lưu ý việc sử dụng ký tự thay thế, |. Có thể có hai, ba, bốn và nhiều tùy chọn hơn. Trước tiên, C ++ sẽ cố gắng so khớp phương án thay thế đầu tiên, con dê, tại mỗi vị trí ký tự trong chuỗi đích. Nếu nó không thành công với dê, nó sẽ thử thay thế tiếp theo, thỏ. Nếu nó không thành công với thỏ, nó sẽ thử thay thế tiếp theo, lợn. Nếu không thành công, thì C ++ sẽ chuyển sang vị trí tiếp theo trong mục tiêu và bắt đầu lại với phương án thay thế đầu tiên.

Trong đoạn mã trên, lợn được khớp.

Đối sánh Bắt đầu hoặc Kết thúc

Bắt đầu


Nếu ^ ở đầu regex, thì văn bản bắt đầu của chuỗi đích có thể được khớp với regex. Trong đoạn mã sau, phần bắt đầu của đích là abc, được khớp:

nếu như (regex_search('abc và def',regex('^ abc')))

Giá cả<< 'phù hợp' <<endl;

Không có khớp nào diễn ra trong mã sau:

nếu như (regex_search('Có, abc và def',regex('^ abc')))

Giá cả<< 'phù hợp' <<endl;

khác

Giá cả<< 'không phù hợp' <<endl;

Ở đây, abc không nằm ở đầu mục tiêu.

Lưu ý: Ký tự dấu mũ, ‘^’, là một siêu ký tự ở đầu của regex, khớp với phần bắt đầu của chuỗi đích. Nó vẫn là một siêu ký tự ở đầu lớp ký tự, nơi nó phủ định lớp đó.

Kết thúc

Nếu $ ở cuối regex, thì văn bản kết thúc của chuỗi đích có thể được khớp với regex. Trong đoạn mã sau, phần cuối của mục tiêu là xyz, được khớp:

nếu như (regex_search('uvw và xyz',regex('xyz $')))

Giá cả<< 'phù hợp' <<endl;

Không có khớp nào diễn ra trong mã sau:

nếu như (regex_search('uvw và xyz cuối cùng',regex('xyz $')))

Giá cả<< 'phù hợp' <<endl;

khác

Giá cả<< 'không phù hợp' <<endl;

Ở đây, xyz không nằm ở cuối mục tiêu.

Phân nhóm

Dấu ngoặc đơn có thể được sử dụng để nhóm các ký tự trong một mẫu. Hãy xem xét regex sau:

'một buổi hòa nhạc (nghệ sĩ dương cầm)'

Nhóm ở đây là nghệ sĩ dương cầm được bao quanh bởi các siêu nhân vật (và). Nó thực sự là một nhóm phụ, trong khi một buổi hòa nhạc (nghệ sĩ piano) là cả nhóm. Hãy xem xét những điều sau:

'Người (nghệ sĩ dương cầm giỏi)'

Ở đây, nhóm phụ hoặc chuỗi phụ, nghệ sĩ piano là tốt.

Chuỗi con với các bộ phận chung

Người ghi sổ là người chăm sóc sách. Hãy tưởng tượng một thư viện với một người giữ sách và giá sách. Giả sử rằng một trong các chuỗi đích sau có trong máy tính:

'Thư viện có tủ sách đáng ngưỡng mộ.';

'Kế toán đây.';

'Người đóng sách làm việc với giá sách.';

Giả sử rằng sở thích của lập trình viên là không biết câu nào trong số những câu này trong máy tính. Tuy nhiên, mối quan tâm của anh ấy là biết liệu giá sách hoặc người giữ sổ có hiện diện trong bất kỳ chuỗi mục tiêu nào trong máy tính hay không. Trong trường hợp này, regex của anh ta có thể là:

'giá sách | người đóng sách.'

Sử dụng luân phiên.

Lưu ý rằng cuốn sách, vốn chung cho cả hai từ, đã được gõ hai lần, trong hai từ theo mẫu. Để tránh nhập sách hai lần, regex sẽ tốt hơn được viết dưới dạng:

'sách (kệ | người giữ)'

Ở đây, nhóm, kệ | thủ môn Siêu ký tự thay thế vẫn được sử dụng, nhưng không phải là hai từ dài. Nó đã được sử dụng cho hai phần kết thúc của hai từ dài. C ++ coi một nhóm như một thực thể. Vì vậy, C ++ sẽ tìm kiếm giá hoặc người giữ xuất hiện ngay sau cuốn sách. Đầu ra của mã sau được khớp:

charP[] = 'Thư viện có một giá sách đáng ngưỡng mộ.';

nếu như (regex_search(P,regex('sách (kệ | người giữ)')))

Giá cả<< 'phù hợp' <<endl;

giá sách và không sổ kế toán đã được khớp với nhau.

Icase và multiline regex_constants

icase

Đối sánh có phân biệt chữ hoa chữ thường theo mặc định. Tuy nhiên, nó có thể được phân biệt chữ hoa chữ thường. Để đạt được điều này, hãy sử dụng hằng số regex :: icase, như trong đoạn mã sau:

nếu như (regex_search('Nhận xét',regex('cho ăn',regex::icase)))

Giá cả<< 'phù hợp' <<endl;

Đầu ra được khớp. Vì vậy, Phản hồi với chữ hoa ‘F’ đã được nguồn cấp dữ liệu khớp với chữ ‘f’ viết thường. regex :: icase đã được làm đối số thứ hai của hàm tạo regex (). Nếu không có điều đó, câu lệnh sẽ không tạo ra một kết quả phù hợp.

Đa dòng

Hãy xem xét đoạn mã sau:

charP[] = 'dòng 1 dòng 2 dòng 3 ';

nếu như (regex_search(P,regex('^. * $')))

Giá cả<< 'phù hợp' <<endl;

khác

Giá cả<< 'không phù hợp' <<endl;

Đầu ra không phù hợp. Regex, ^. * $, Khớp với chuỗi mục tiêu từ đầu đến cuối của nó. . * có nghĩa là bất kỳ ký tự nào ngoại trừ n, không hoặc nhiều lần. Vì vậy, do các ký tự dòng mới ( n) trong mục tiêu, không khớp.

Mục tiêu là một chuỗi nhiều dòng. Để ‘.’ Khớp với ký tự dòng mới, hằng số regex :: multiline phải được tạo, đối số thứ hai của cấu trúc regex (). Đoạn mã sau minh họa điều này:

charP[] = 'dòng 1 dòng 2 dòng 3 ';

nếu như (regex_search(P,regex('^. * $',regex::nhiều dòng)))

Giá cả<< 'phù hợp' <<endl;

khác

Giá cả<< 'không phù hợp' <<endl;

Khớp toàn bộ chuỗi mục tiêu

Để khớp với toàn bộ chuỗi mục tiêu không có ký tự dòng mới ( n), có thể sử dụng hàm regex_match (). Hàm này khác với hàm regex_search (). Đoạn mã sau minh họa điều này:

charP[] = 'thứ hai thứ ba đầu tiên';

nếu như (regex_match(P,regex('.*thứ hai.*')))

Giá cả<< 'phù hợp' <<endl;

Có một trận đấu ở đây. Tuy nhiên, lưu ý rằng regex khớp với toàn bộ chuỗi mục tiêu và chuỗi mục tiêu không có bất kỳ ‘ n’ nào.

Đối tượng match_results

Hàm regex_search () có thể nhận một đối số ở giữa đích và đối tượng regex. Đối số này là đối tượng match_results. Toàn bộ chuỗi (phần) được so khớp và các chuỗi con được so khớp có thể được biết với nó. Đối tượng này là một mảng đặc biệt với các phương thức. Loại đối tượng match_results là cmatch (đối với chuỗi ký tự).

Thu thập các trận đấu

Hãy xem xét đoạn mã sau:

charP[] = 'Người phụ nữ bạn đang tìm kiếm!';

cm phù hợp với m;

nếu như (regex_search(P,NS,regex('w.m.n')))

Giá cả<<NS[0] <<endl;

Chuỗi mục tiêu có từ phụ nữ. Đầu ra là phụ nữ ', tương ứng với regex, w.m.n. Ở chỉ số 0, mảng đặc biệt chứa kết quả phù hợp duy nhất, đó là phụ nữ.

Với các tùy chọn lớp, chỉ chuỗi con đầu tiên được tìm thấy trong mục tiêu, được gửi đến mảng đặc biệt. Đoạn mã sau minh họa điều này:

cm phù hợp với m;

nếu như (regex_search('Con chuột, con mèo, con dơi!',NS,regex('[bcr] lúc')))

Giá cả<<NS[0] <<endl;

Giá cả<<NS[1] <<endl;

Giá cả<<NS[2] <<endl;

Đầu ra là chuột từ chỉ số 0. m [1] và m [2] trống.

Với các lựa chọn thay thế, chỉ chuỗi con đầu tiên được tìm thấy trong mục tiêu, được gửi đến mảng đặc biệt. Đoạn mã sau minh họa điều này:

nếu như (regex_search('Con thỏ, con dê, con lợn!',NS,regex('dê | thỏ | lợn')))

Giá cả<<NS[0] <<endl;

Giá cả<<NS[1] <<endl;

Giá cả<<NS[2] <<endl;

Đầu ra là con thỏ từ chỉ số không. m [1] và m [2] trống.

Nhóm

Khi các nhóm được tham gia, mẫu hoàn chỉnh đã khớp sẽ đi vào ô 0 của mảng đặc biệt. Chuỗi con tiếp theo được tìm thấy đi vào ô 1; chuỗi con theo sau, đi vào ô 2; và như thế. Đoạn mã sau minh họa điều này:

nếu như (regex_search('Sách bán chạy nhất hiện nay!',NS,regex('book ((sel) (ler))')))

Giá cả<<NS[0] <<endl;

Giá cả<<NS[1] <<endl;

Giá cả<<NS[2] <<endl;

Giá cả<<NS[3] <<endl;

Đầu ra là:

người bán sách

người bán

tủ

đọc

Lưu ý rằng nhóm (người bán) đứng trước nhóm (sel).

Vị trí của trận đấu

Có thể biết vị trí khớp của mỗi chuỗi con trong mảng cmatch. Việc đếm bắt đầu từ ký tự đầu tiên của chuỗi đích, ở vị trí số không. Đoạn mã sau minh họa điều này:

cm phù hợp với m;

nếu như (regex_search('Sách bán chạy nhất hiện nay!',NS,regex('book ((sel) (ler))')))

Giá cả<<NS[0] << '->' <<NS.Chức vụ(0) <<endl;

Giá cả<<NS[1] << '->' <<NS.Chức vụ(1) <<endl;

Giá cả<<NS[2] << '->' <<NS.Chức vụ(2) <<endl;

Giá cả<<NS[3] << '->' <<NS.Chức vụ(3) <<endl;

Lưu ý việc sử dụng thuộc tính vị trí, với chỉ mục ô, làm đối số. Đầu ra là:

người bán sách->5

người bán->9

tủ->9

đọc->12

Tìm kiếm và Thay thế

Một từ hoặc cụm từ mới có thể thay thế kết quả phù hợp. Hàm regex_replace () được sử dụng cho việc này. Tuy nhiên, lần này, chuỗi mà sự thay thế xảy ra là đối tượng chuỗi, không phải là chuỗi ký tự. Vì vậy, thư viện chuỗi phải được đưa vào chương trình. Hình minh họa:

#bao gồm

#bao gồm

#bao gồm

sử dụng không gian tên std;

NSchủ chốt()
{
chuỗi str= 'Đây, người đàn ông của tôi đây. Người đàn ông của bạn đi rồi. ';
chuỗi newStr=regex_replace(P,regex('Đàn ông'), 'người đàn bà');
Giá cả<<newStr<<endl;

trở lại 0;
}

Hàm regex_replace (), như được mã hóa ở đây, sẽ thay thế tất cả các kết quả phù hợp. Đối số đầu tiên của hàm là đích, đối số thứ hai là đối tượng regex và đối số thứ ba là chuỗi thay thế. Hàm trả về một chuỗi mới, là đích nhưng có thay thế. Đầu ra là:

Người phụ nữ của tôi đây. Đó là người phụ nữ của bạn.

Phần kết luận

Biểu thức chính quy sử dụng các mẫu để so khớp các chuỗi con trong chuỗi trình tự đích. Các mẫu có siêu ký tự. Các hàm thường được sử dụng cho biểu thức chính quy C ++, là: regex_search (), regex_match () và regex_replace (). Regex là một mẫu trong dấu ngoặc kép. Tuy nhiên, các hàm này lấy đối tượng regex làm đối số chứ không chỉ là regex. Regex phải được tạo thành một đối tượng regex trước khi các hàm này có thể sử dụng nó.