Ruby - Biểu thức chính quy

Một biểu thức chính quy là một chuỗi đặc biệt của nhân vật giúp bạn kết hợp hoặc tìm chuỗi khác hoặc bộ dây bằng cách sử dụng cú pháp chuyên tổ chức tại một mô hình.

Một chữ biểu thức chính quy là một mẫu giữa các dấu gạch chéo hoặc giữa các dấu phân cách tùy ý theo sau là% r như sau:

Cú pháp

/pattern/
/pattern/im    # option can be specified
%r!/usr/local! # general delimited regular expression

Thí dụ

#!/usr/bin/ruby

line1 = "Cats are smarter than dogs";
line2 = "Dogs also like meat";

if ( line1 =~ /Cats(.*)/ )
   puts "Line1 contains Cats"
end
if ( line2 =~ /Cats(.*)/ )
   puts "Line2 contains  Dogs"
end

Điều này sẽ tạo ra kết quả sau:

Line1 contains Cats

Công cụ sửa đổi biểu thức chính quy

Các ký tự biểu thức chính quy có thể bao gồm một công cụ sửa đổi tùy chọn để kiểm soát các khía cạnh khác nhau của đối sánh. Công cụ sửa đổi được chỉ định sau ký tự gạch chéo thứ hai, như được hiển thị trước đó và có thể được đại diện bởi một trong các ký tự này -

Sr.No. Công cụ sửa đổi & mô tả
1

i

Bỏ qua chữ hoa khi khớp văn bản.

2

o

Thực hiện nội suy # {} chỉ một lần, lần đầu tiên ký tự regexp được đánh giá.

3

x

Bỏ qua khoảng trắng và cho phép nhận xét trong biểu thức chính quy.

4

m

Khớp nhiều dòng, nhận dạng các dòng mới là các ký tự bình thường.

5

u,e,s,n

Phiên dịch regexp dưới dạng Unicode (UTF-8), EUC, SJIS hoặc ASCII. Nếu không có công cụ sửa đổi nào trong số này được chỉ định, thì biểu thức chính quy được giả định sử dụng mã hóa nguồn.

Giống như các ký tự chuỗi được phân tách bằng% Q, Ruby cho phép bạn bắt đầu các biểu thức chính quy của mình với% r theo sau là dấu phân cách bạn chọn. Điều này rất hữu ích khi mẫu bạn đang mô tả có chứa nhiều ký tự gạch chéo mà bạn không muốn thoát ra -

# Following matches a single slash character, no escape required
%r|/|

# Flag characters are allowed with this syntax, too
%r[</(.*)>]i

Mẫu biểu thức chính quy

Ngoại trừ các ký tự điều khiển, (+ ? . * ^ $ ( ) [ ] { } | \), tất cả các ký tự đều khớp với nhau. Bạn có thể thoát một ký tự điều khiển bằng cách đặt trước nó một dấu gạch chéo ngược.

Sr.No. Mô hình & Mô tả
1

^

Đối sánh đầu dòng.

2

$

Đối sánh với cuối dòng.

3

.

Khớp với bất kỳ ký tự đơn nào ngoại trừ dòng mới. Sử dụng tùy chọn m cũng cho phép nó khớp với dòng mới.

4

[...]

Khớp bất kỳ ký tự đơn nào trong ngoặc.

5

[^...]

Đối sánh bất kỳ ký tự đơn nào không có trong dấu ngoặc

6

re*

Khớp với 0 hoặc nhiều lần xuất hiện của biểu thức trước.

7

re+

Khớp với 1 hoặc nhiều lần xuất hiện của biểu thức trước.

số 8

re?

Khớp với 0 hoặc 1 lần xuất hiện của biểu thức trước.

9

re{ n}

Khớp chính xác n số lần xuất hiện của biểu thức trước.

10

re{ n,}

Khớp với n hoặc nhiều lần xuất hiện của biểu thức trước.

11

re{ n, m}

Khớp ít nhất n và nhiều nhất m lần xuất hiện của biểu thức trước.

12

a| b

Đối sánh với a hoặc b.

13

(re)

Nhóm các biểu thức chính quy và ghi nhớ văn bản phù hợp.

14

(?imx)

Tạm thời bật tắt các tùy chọn i, m hoặc x trong một biểu thức chính quy. Nếu trong ngoặc đơn, chỉ vùng đó bị ảnh hưởng.

15

(?-imx)

Tạm thời tắt các tùy chọn i, m hoặc x trong một biểu thức chính quy. Nếu trong ngoặc đơn, chỉ vùng đó bị ảnh hưởng.

16

(?: re)

Nhóm các biểu thức chính quy mà không cần nhớ văn bản phù hợp.

17

(?imx: re)

Tạm thời bật tắt các tùy chọn i, m hoặc x trong dấu ngoặc đơn.

18

(?-imx: re)

Tạm thời tắt các tùy chọn i, m hoặc x trong dấu ngoặc đơn.

19

(?#...)

Bình luận.

20

(?= re)

Chỉ định vị trí bằng cách sử dụng một mẫu. Không có phạm vi.

21

(?! re)

Chỉ định vị trí bằng cách sử dụng phủ định mẫu. Không có phạm vi.

22

(?> re)

Khớp với mẫu độc lập mà không cần bẻ khóa ngược.

23

\w

Khớp các ký tự từ.

24

\W

Đối sánh các ký tự không phải từ khóa.

25

\s

Khớp khoảng trắng. Tương đương với [\ t \ n \ r \ f].

26

\S

Khớp với khoảng trắng.

27

\d

Khớp các chữ số. Tương đương với [0-9].

28

\D

Phù hợp với nondigits.

29

\A

Đối sánh với phần đầu của chuỗi.

30

\Z

Đối sánh với cuối chuỗi. Nếu một dòng mới tồn tại, nó sẽ khớp ngay trước dòng mới.

31

\z

Đối sánh với cuối chuỗi.

32

\G

Các trận đấu chỉ kết thúc trận đấu cuối cùng.

33

\b

Khớp các ranh giới từ khi nằm ngoài dấu ngoặc. Khớp với khoảng trắng lùi (0x08) khi bên trong dấu ngoặc.

34

\B

Khớp các ranh giới không phải từ.

35

\n, \t, etc.

Khớp với dòng mới, dấu xuống dòng, tab, v.v.

36

\1...\9

Đối sánh biểu thức con được nhóm thứ n.

37

\10

Đối sánh biểu thức con được nhóm thứ n nếu nó đã khớp. Mặt khác đề cập đến biểu diễn bát phân của mã ký tự.

Ví dụ về Cụm từ Thông dụng

Sr.No. Ví dụ & Mô tả
1

/ruby/

Phù hợp với "ruby".

2

¥

Khớp Yến ký. Các ký tự Multibyte được hỗ trợ trong Ruby 1.9 và Ruby 1.8.

Sr.No. Ví dụ & Mô tả
1

/[Rr]uby/

Đối sánh với "Ruby" hoặc "ruby".

2

/rub[ye]/

Đối sánh với "ruby" hoặc "rube".

3

/[aeiou]/

Khớp với bất kỳ một nguyên âm chữ thường nào.

4

/[0-9]/

Khớp với bất kỳ chữ số nào; giống với / [0123456789] /.

5

/[a-z]/

Khớp với mọi ký tự ASCII viết thường.

6

/[A-Z]/

Khớp với bất kỳ ký tự ASCII viết hoa nào.

7

/[a-zA-Z0-9]/

Phù hợp với bất kỳ điều nào ở trên.

số 8

/[^aeiou]/

Khớp với bất kỳ thứ gì khác ngoài một nguyên âm viết thường.

9

/[^0-9]/

Đối sánh với bất kỳ thứ gì khác ngoài một chữ số.

Sr.No. Ví dụ & Mô tả
1

/./

Khớp với bất kỳ ký tự nào ngoại trừ dòng mới.

2

/./m

Trong chế độ nhiều dòng, cũng khớp với dòng mới.

3

/\d/

Khớp một chữ số: / [0-9] /.

4

/\D/

Đối sánh với một không phải chữ số: / [^ 0-9] /.

5

/\s/

Khớp với một ký tự khoảng trắng: / [\ t \ r \ n \ f] /.

6

/\S/

Đối sánh không phải khoảng trắng: / [^ \ t \ r \ n \ f] /.

7

/\w/

Khớp một ký tự từ đơn: / [A-Za-z0-9 _] /.

số 8

/\W/

Khớp một ký tự không phải từ: / [^ A-Za-z0-9 _] /.

Sr.No. Ví dụ & Mô tả
1

/ruby?/

Đối sánh với "rub" hoặc "ruby": y là tùy chọn.

2

/ruby*/

Đối sánh "chà" cộng với 0 hoặc nhiều ys.

3

/ruby+/

Đối sánh "chà" cộng với 1 hoặc nhiều ys.

4

/\d{3}/

Khớp chính xác 3 chữ số.

5

/\d{3,}/

Khớp với 3 chữ số trở lên.

6

/\d{3,5}/

Đối sánh 3, 4 hoặc 5 chữ số.

Điều này phù hợp với số lần lặp lại nhỏ nhất -

Sr.No. Ví dụ & Mô tả
1

/<.*>/

Lặp lại tham lam: khớp với "<ruby> perl>".

2

/<.*?>/

Không tham lam: đối sánh "<ruby>" trong "<ruby> perl>".

Sr.No. Ví dụ & Mô tả
1

/\D\d+/

Không có nhóm: + lặp lại \ d

2

/(\D\d)+/

Đã nhóm: + lặp lại cặp \ D \ d

3

/([Rr]uby(, )?)+/

Đối sánh "Ruby", "Ruby, ruby, ruby", v.v.

Điều này khớp lại với một nhóm đã khớp trước đó -

Sr.No. Ví dụ & Mô tả
1

/([Rr])uby&\1ails/

Phù hợp với ruby ​​& rails hoặc Ruby & Rails.

2

/(['"])(?:(?!\1).)*\1/

Chuỗi được trích dẫn đơn hoặc kép. \ 1 đối sánh với bất kỳ thứ gì mà nhóm đầu tiên phù hợp. \ 2 đối sánh với bất kỳ thứ gì mà nhóm thứ hai phù hợp, v.v.

Sr.No. Ví dụ & Mô tả
1

/ruby|rube/

Đối sánh với "ruby" hoặc "rube".

2

/rub(y|le))/

Đối sánh với "ruby" hoặc "rúp".

3

/ruby(!+|\?)/

"ruby" theo sau bởi một hoặc nhiều! hay một cái?

Nó cần xác định vị trí khớp.

Sr.No. Ví dụ & Mô tả
1

/^Ruby/

Đối sánh "Ruby" ở đầu chuỗi hoặc dòng nội bộ.

2

/Ruby$/

Đối sánh "Ruby" ở cuối một chuỗi hoặc dòng.

3

/\ARuby/

Đối sánh "Ruby" ở đầu một chuỗi.

4

/Ruby\Z/

Đối sánh "Ruby" ở cuối chuỗi.

5

/\bRuby\b/

Đối sánh "Ruby" ở một ranh giới từ.

6

/\brub\B/

\ B là ranh giới không phải từ: đối sánh "rub" trong "rube" và "ruby" nhưng không khớp với một mình.

7

/Ruby(?=!)/

Đối sánh với "Ruby", nếu theo sau là dấu chấm than.

số 8

/Ruby(?!!)/

Đối sánh với "Ruby", nếu không có dấu chấm than theo sau.

Sr.No. Ví dụ & Mô tả
1

/R(?#comment)/

Đối sánh với "R". Tất cả phần còn lại là một bình luận.

2

/R(?i)uby/

Không phân biệt chữ hoa chữ thường khi đối sánh "uby".

3

/R(?i:uby)/

Giống như trên.

4

/rub(?:y|le))/

Chỉ nhóm mà không tạo \ 1 backreference.

Tìm kiếm và Thay thế

Một số phương thức Chuỗi quan trọng nhất sử dụng biểu thức chính quy là subgsubvà các biến thể tại chỗ của chúng sub!gsub!.

Tất cả các phương pháp này thực hiện thao tác tìm kiếm và thay thế bằng cách sử dụng mẫu Regexp. Cácsub & sub! thay thế lần xuất hiện đầu tiên của mẫu và gsub & gsub! thay thế tất cả các lần xuất hiện.

Các subgsub trả về một chuỗi mới, để lại chuỗi ban đầu không được sửa đổi ở vị trí sub!gsub! sửa đổi chuỗi mà chúng được gọi.

Sau đây là ví dụ -

#!/usr/bin/ruby

phone = "2004-959-559 #This is Phone Number"

# Delete Ruby-style comments
phone = phone.sub!(/#.*$/, "")   
puts "Phone Num : #{phone}"

# Remove anything other than digits
phone = phone.gsub!(/\D/, "")    
puts "Phone Num : #{phone}"

Điều này sẽ tạo ra kết quả sau:

Phone Num : 2004-959-559
Phone Num : 2004959559

Sau đây là một ví dụ khác -

#!/usr/bin/ruby

text = "rails are rails, really good Ruby on Rails"

# Change "rails" to "Rails" throughout
text.gsub!("rails", "Rails")

# Capitalize the word "Rails" throughout
text.gsub!(/\brails\b/, "Rails")
puts "#{text}"

Điều này sẽ tạo ra kết quả sau:

Rails are Rails, really good Ruby on Rails