Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Nắm vững các biểu thức chính quy trong Ruby:Hướng dẫn thực hành

Bạn có thể đã nghe nói đến RegEx, viết tắt của cụm từ thông dụng. Nghe có vẻ đáng sợ nhưng cũng không quá tệ khi bạn đã quen với ý nghĩa của các mẫu cũng như cách xây dựng một biểu thức thực tế và sử dụng nó. Khi bạn đã quen với việc suy nghĩ về chuỗi và văn bản theo cách trừu tượng hơn, nó có thể là một công cụ hữu ích để giải quyết các vấn đề mà bạn đang tìm kiếm các mẫu chung trong một tập hợp dữ liệu. 

RegEx là một phương pháp khớp mẫu:một cách để lọc chuỗi hoặc văn bản dựa trên mẫu, thường là để trích xuất và sửa đổi văn bản mong muốn. Trong bài viết này, chúng ta sẽ thảo luận về cách sử dụng Biểu thức chính quy và cách kiểm tra các biểu thức đó bằng các phương thức Ruby để kết hợp vào logic cho dự án của bạn.

Một công cụ cực kỳ hữu ích khi giúp bạn hình dung và hiểu RegEx là trang web có tên Rubular. Nhấp vào liên kết ở đây để kiểm tra RegEx bằng cách sử dụng khối văn bản đã được điền sẵn. Bạn sẽ nhận thấy rằng ở giữa hai dấu gạch chéo về phía trước là một chuỗi có từ 'hàng xóm' trong đó. 

Dù bạn có tin hay không, đây là một biểu thức thông thường! Toàn bộ từ, câu, đoạn thậm chí về mặt kỹ thuật có thể được gọi là biểu thức chính quy (miễn là chúng nằm giữa hai dấu gạch chéo về phía trước). Môi trường Rubular làm nổi bật cho chúng ta từng trường hợp riêng lẻ của mẫu 'hàng xóm' trong khối văn bản của chúng ta - ngay cả những trường hợp trong đó hàng xóm cũng là một phần của một từ lớn hơn! Nói như vậy, bạn có thể muốn tìm thứ gì đó trừu tượng hơn là một từ khớp chính xác. Đây là lúc siêu ký tự xuất hiện.

Siêu ký tự

Nắm vững các biểu thức chính quy trong Ruby:Hướng dẫn thực hành Việc sử dụng RegEx có thể là một thách thức đối với các lập trình viên dày dạn kinh nghiệm, vì vậy đừng nản lòng.

Giống như các nguyên tử là khối xây dựng của hầu hết mọi thứ chúng ta thấy xung quanh, siêu ký tự là khối xây dựng của các biểu thức chính quy. Khi bạn thêm vào biểu thức chính quy của mình, mẫu tổng thể sẽ thay đổi. Và khi mô hình tổng thể thay đổi, kết quả bạn nhận được từ các phương pháp bạn sử dụng có thể khác. 

Dưới đây là một số cách để sửa đổi biểu thức chính quy của bạn để bạn có thể tìm thấy mẫu phù hợp với mình. Không có ai hoàn toàn đúng cách viết biểu thức chính quy cho số điện thoại hoặc email, v.v. – tất cả đều đáp ứng nhu cầu của bạn đối với dự án của mình. 

MetacharacterMatchesExample[abc]Một lớp ký tự khớp với một ký tự trong chuỗi có thể là a, b hoặc c
/[eig]/ có thể khớp với các phần của hàng xóm, apple hoặc cổng[^abc] Một lớp ký tự phủ định khớp với mọi ký tự trong chuỗi nhưng a, b hoặc c/[^eig]/ có thể khớp với các phần của hàng xóm, táo hoặc cổng [a-z] Một lớp ký tự khớp với bất kỳ ký tự đơn nào trong phạm vi a-z/[e-i]/ có thể khớp với các ký tự đơn trong các phần của hàng xóm, táo hoặc cổng
[a-zA-Z]Một lớp ký tự khớp với một loạt ký tự từ a-z hoặc A-Z
/[e-i]/ có thể khớp các ký tự đơn trong các phần của “Xin chào hàng xóm!”, Grapple hoặc cổng^ Đầu dòng/^Xin chào/ khớp với các dòng bắt đầu bằng ‘Xin chào’$Cuối dòng/Tạm biệt$/ khớp với các dòng kết thúc bằng ‘Tạm biệt’\ABắt đầu chuỗi. Tương tự như '^' , nhưng không có chế độ nhiều dòng/\Aa/ khớp với 'a' trong apple, nhưng không khớp với 'a' trong mơ vì nó không phải là đầu chuỗi:
táo
mơ\z Kết thúc chuỗi. Tương tự như ‘$’, nhưng không có chế độ nhiều dòng/\za/ khớp với ‘a’ trong zebra, nhưng không khớp với ‘a’ trong libra vì nó không phải là phần cuối của chuỗi
librazebra.Wild thẻ. Dấu chấm khớp với bất kỳ ký tự nào. /./ sẽ khớp với bất kỳ ký tự đơn nào trong apple+Khớp một hoặc nhiều siêu ký tự trước đó/aa+/ sẽ khớp với 'aa', 'aaaaaaa' nhưng sẽ không khớp với 'a' vì nó phải là một hoặc nhiều siêu ký tự trước đó (trong trường hợp này là siêu ký tự thứ hai)*Khớp với 0 hoặc nhiều siêu ký tự trước đó/ab*/ sẽ khớp với 'a', 'ab', 'abbbbbb'\sBất kỳ khoảng trắng nào character/^The\s.+s$/ sẽ khớp với The Beatles , The Rolling Stones, The Cranberries, v.v. \SBất kỳ ký tự không phải khoảng trắng/\S+/ sẽ khớp với The Beatles , The Rolling Stones, The Cranberries, v.v. \dBất kỳ chữ số nào/\d+/ sẽ khớp với 22, 33333, 0, v.v.\DBất kỳ chữ số nào không có chữ số/\D+/ sẽ khớp với 'Xin chào, tạm biệt'\wBất kỳ ký tự từ nào/ny\w*/ sẽ khớp với 'ny_152', 'nypost39', v.v.\WBất kỳ ký tự không phải từ nào/\W+/ sẽ khớp với ')(*&^%$'a{3}Chính xác 3 trong số 'a'/\d{3}-\d{3}-\d{4}/ sẽ khớp với 555-555-5555a{3,}Ba hoặc nhiều hơn 'a'/[a-zA-Z0-9!#$^&*)(]{8,}/ sẽ khớp với 'xE*BqRx14B7TAQp' ⇐ có vẻ như nó có thể được sử dụng làm mật khẩu!a{3, 6}Ba đến sáu trong số ‘a’/[a-zA-Z0-9!#$^&*)(]{8,32}/ sẽ khớp với ‘0XX!pC3Odpu30Qc’ vì nó có độ dài lớn hơn 3 và nhỏ hơn 32 ký tự a?0 hoặc 1 trong số ‘a’/\d?-\d{3)-\d{3}-\d{4}/ sẽ khớp với số điện thoại có mã quốc tế được đính kèm ở phía trước và một số không có mã quốc tế được đính kèm về phía trước. 

Việc sử dụng siêu ký tự là cách tuyệt vời để xác thực khi người dùng điền vào biểu mẫu trên trang web. Chúng tôi muốn đảm bảo thông tin được nhập chính xác – đó sẽ là một cách sử dụng RegEx tuyệt vời để đảm bảo mẫu địa chỉ hoặc email hoặc số điện thoại có định dạng chính xác. Điều này dẫn đến cơ sở dữ liệu được tổ chức tốt hơn, ít xảy ra lỗi người dùng hơn khi đăng ký tài khoản mới. 

Các phương pháp kiểm tra RegEx trong Ruby

Đây là đoạn mã chúng ta sẽ sử dụng để phân biệt giữa quét và so khớp:

#!/usr/bin/ruby
 
class RegexTest
 def initialize(str, regex)
 @str = str
 @regex = regex
 @result = str.scan(regex)
 end
 def display_details()
 puts "String = #@str"
 puts "regex = #@regex"
 puts "result = #@result"
 end
end
# Create Objects
str1 = RegexTest.new("The rain in Spain stays mainly on the plain", /\w+ain/)
str2 = RegexTest.new("In Hertford, Hereford, and Hampshire, hurricanes hardly ever happen", /H\w+/)
# Call Methods
str1.display_details()
str2.display_details()

Quét

Phương thức quét trong Ruby trả về một mảng gồm tất cả các chuỗi khớp với biểu thức chính quy của bạn:

str1: result = ["rain", "Spain", "main", "plain"]

str2: result = ["Hertford", "Hereford", "Hampshire"]

Điều này cho phép bạn làm bất cứ điều gì bạn muốn với kết quả.

Trận đấu RegExp

Phương thức Match của biểu thức chính quy rất RẤT giống với quét, nhưng tìm thấy phiên bản đầu tiên của một kết quả khớp thay vì tất cả các kết quả khớp. Thay đổi @result =str.scan(regex) thành  @result =str.match(regex) để xem sự khác biệt: 

str1:result = rain

str2:result = Hertford

Tuy nhiên, Match trả về một đối tượng . Nó có một số phương thức liên quan đến nó có thể được sử dụng trong logic khi bạn sử dụng kết quả của mình. Hãy xem tài liệu Ruby để biết thêm thông tin về những gì bạn có thể sử dụng ở đó. 

Grep

Grep là một phương pháp có thể đếm được để tìm các chuỗi khớp trong mảng. Nó sẽ trả về một mảng gồm tất cả các chuỗi khớp với biểu thức chính quy của bạn. Với mã chúng tôi có, chúng tôi phải đảm bảo rằng chuỗi chúng tôi truyền vào được chia thành một mảng. 

Để thực hiện việc này, hãy thay đổi dòng mã này:

@result = str.match(regex)

Và đổi nó thành:

@result = str.split(/\s|,/).grep(regex);

Nắm vững các biểu thức chính quy trong Ruby:Hướng dẫn thực hành

"Nghề nghiệp đã bước vào cuộc đời tôi khi tôi cần nó nhất và nhanh chóng giúp tôi tham gia chương trình đào tạo. Hai tháng sau khi tốt nghiệp, tôi đã tìm được công việc mơ ước phù hợp với các giá trị và mục tiêu trong cuộc sống của mình!"

Venus, Kỹ sư phần mềm tại Rockbot

Tìm trận đấu Bootcamp của bạn

Sau đó bạn sẽ nhận được kết quả tương tự như kết quả đầu tiên: 

str1: result = ["rain", "Spain", "main", "plain"]

str2: result = ["Hertford", "Hereford", "Hampshire"]

Str =~ RegEx

Sử dụng =~ toán tử khớp cơ bản, chúng ta có thể so sánh chuỗi với biểu thức chính quy và trả về chỉ mục đầu tiên của kết quả khớp. Nó sẽ trả về con số 0 nếu không có kết quả phù hợp. 

Kết luận

Trong bài viết này, chúng tôi đã thảo luận về cách sử dụng biểu thức chính quy (RegEx) trong Ruby. Nếu bạn muốn tìm hiểu thêm về những gì bạn có thể xây dựng với Ruby, hãy xem bài viết của chúng tôi, ”Mã Ruby được sử dụng để làm gì?

Bạn muốn có cách học Ruby tốt hơn? Hãy để Career Karma giúp bạn tìm được chương trình đào tạo tốt nhất cho mình.