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

Hướng dẫn hoàn chỉnh các phương thức String Ruby – Thành thao thao tác văn bản

Một chuỗi (string) là một chuỗi ký tự.

String là đối tượng nên chúng có rất nhiều phương thức bạn có thể dùng để làm việc với chúng.

Trong bài viết này bạn sẽ khám phá các phương thức String Ruby hữu ích nhất kèm ví dụ!

Mục lục

  • 1 Cách lấy độ dài chuỗi
  • 2 Cách kiểm tra chuỗi rỗng
  • 3 Nội suy chuỗi (String Interpolation) là gì?
  • 4 Cách trích xuất chuỗi con (substring)
  • 5 Cách kiểm tra chuỗi chứa chuỗi khác
  • 6 Cách padding (đệm) chuỗi Ruby
  • 7 So sánh chuỗi bỏ qua chữ hoa/thường
  • 8 Cách trim chuỗi & loại bỏ khoảng trắng
  • 9 Prefix & Suffix của chuỗi
  • 10 Chuyển chuỗi thành mảng ký tự
  • 11 Chuyển mảng thành chuỗi
  • 12 Chuyển chuỗi thành Integer
  • 13 Kiểm tra chuỗi có phải số không
  • 14 Cách nối ký tự (append)
  • 15 Duyệt qua các ký tự của chuỗi
  • 16 Cách chuyển chuỗi thành chữ hoa hoặc chữ thường
  • 17 Cách tạo chuỗi đa dòng (multiline)
  • 18 Cách thay thế văn bản trong chuỗi dùng Gsub
  • 19 Cách xóa ký tự cuối cùng của chuỗi
  • 20 Cách thay đổi encoding chuỗi
  • 21 Đếm ký tự
  • 22 Tóm tắt

Cách lấy độ dài chuỗi

Dễ dàng:

"ruby".size # 4

Bạn cũng có thể dùng length, thay vì size, chúng làm cùng việc.

Cách kiểm tra chuỗi rỗng

Chúng ta định nghĩa chuỗi rỗng là chuỗi độ dài bằng không.

Bạn có thể kiểm tra như sau:

"".size == 0 # true

Hoặc tốt hơn, dùng phương thức empty?.

Ví dụ:

"".empty? # true

Chuỗi blank (trắng) là chuỗi hoặc độ dài bằng không, hoặc chỉ bao gồm ký tự khoảng trắng.

Nội suy chuỗi (String Interpolation) là gì?

Nội suy chuỗi cho phép bạn kết hợp chuỗi lại với nhau:

name = "Jesus"
puts "Hello #{name}"

Điều một số người không biết là bạn có thể có mã thực tế bên trong nội suy.

Đây là ví dụ:

puts "The total is #{1+1}" # "the total is 2"

Ruby gọi phương thức to_s trên khối nội suy chuỗi, điều này nói cho đối tượng chuyển đổi thành chuỗi.

Cách trích xuất chuỗi con (Substring)

Chuỗi con là phần nhỏ hơn của chuỗi, hữu ích nếu bạn chỉ muốn phần cụ thể đó, như đầu, giữa, hoặc cuối.

Làm thế nào để lấy substring trong Ruby?

Một cách là dùng chỉ mục bắt đầu & số lượng ký tự, trong dấu ngoặc vuông, phân tách bằng dấu phẩy.

Như sau:

string = "abc123"
string[0,3] # "abc"
string[3,3] # "123"

Số đầu tiên là chỉ mục bắt đầu.

Số thứ hai là số ký tự bạn muốn.

Bạn cũng có thể dùng range (phạm vi) nếu muốn làm như “lấy tất cả ký tự trừ cái cuối”.

Ví dụ:

string = "abc123"
string[0..-2] # "abc12"

Bây giờ, chỉ mục đầu vẫn là chỉ mục bắt đầu, nhưng chỉ mục thứ hai là chỉ mục kết thúc (inclusive). -2 này là ký tự倒数第二, và -1 là cuối chuỗi.

Nếu bạn muốn xóa hoặc thay thế substring.

Bạn có thể làm:

string[0..2] = ""
p string # "123"

Rất hay!

Cách kiểm tra chuỗi chứa chuỗi khác

Cách dễ nhất để tìm chuỗi có nằm trong chuỗi khác không?

Phương thức include?:

string = "Today is Saturday"
string.include?("Saturday") # true

Bạn cũng có thể dùng phương thức index:

string = "Today is Sunday"
string.index("day") # 2

Phương thức này tìm từ một phần & thay vì trả về true/false nó cho bạn chỉ mục nơi bắt đầu của chuỗi này được tìm thấy.

Trong ví dụ này, index đang tìm “day” trong “Today”.

Nếu bạn muốn tìm mẫu (như tất cả từ chứa từ “day”) bạn đang tìm biểu thức chính quy (regular expressions).

Cách padding (đệm) chuỗi Ruby

Một cách để padding chuỗi là dùng phương thức rjust với hai tham số:

binary_string = "1101"
binary_string.rjust(8, "0") # "00001101"

Nếu bạn muốn padding bên phải bạn dùng ljust:

binary_string = "1111"
binary_string.ljust(8, "0") # "11110000"

So sánh chuỗi bỏ qua chữ hoa/thường

Vì so sánh chuỗi phân biệt chữ hoa/thường (case-sensitive) bạn muốn chắc chắn hai chuỗi bạn so sánh ở cùng case.

Cách phổ biến là làm cho cả hai vế downcase hoặc upcase.

Ví dụ:

lang1 = "ruby"
lang2 = "Ruby"
lang1.upcase == lang2.upcase

Cũng có phương thức casecmp? làm so sánh không phân biệt case, nhưng nó hiếm khi dùng.

Hãy dùng ví dụ trên.

Cách trim chuỗi & loại bỏ khoảng trắng

Khi đọc dữ liệu từ file hoặc website bạn có thể thấy khoảng trắng thừa trong chuỗi.

Bạn có thể loại bỏ khoảng trắng đó với phương thức strip:

extra_space = " test "
extra_space.strip # "test"

Nếu bạn chỉ muốn xóa khoảng trắng một bên (trái/phải) bạn dùng lstrip & rstrip.

Prefix & Suffix của chuỗi

Bạn có thể dùng phương thức start_with? để kiểm tra chuỗi có bắt đầu bằng prefix cụ thể không.

Ví dụ:

string = "ruby programming"
string.start_with? "ruby" # true

Cũng có phương thức end_with?:

string = "ruby programming"
string.end_with? "programming" # true

Thêm vào đó, Ruby 2.5 giới thiệu phương thức delete_prefix & delete_suffix, có thể hữu ích cho bạn.

Ví dụ:

string = "bacon is expensive"
string.delete_suffix(" is expensive") # "bacon"

Chuyển chuỗi thành mảng ký tự

Lấy chuỗi & tách thành mảng ký tự dễ dàng với phương thức split.

Ví dụ:

string = "a b c d"
string.split # ["a", "b", "c", "d"]

Mặc định split dùng khoảng trắng làm ký tự phân tách, nhưng bạn có thể truyền tham số để chỉ định phân tách khác.

Đây là cách tách danh sách giá trị phân tách bởi dấu phẩy (CSV):

csv = "a,b,c,d"
string.split(",") # ["a", "b", "c", "d"]

Nhưng nếu bạn làm việc với dữ liệu CSV cụ thể bạn có thể muốn cân nhắc dùng class CSV từ thư viện chuẩn. Class này có thể đọc header cột, làm cho mọi thứ dễ dàng hơn.

Chuyển mảng thành chuỗi

Nếu bạn muốn lấy mảng chuỗi & nối chúng thành chuỗi lớn bạn dùng phương thức join.

Ví dụ:

arr = ['a', 'b', 'c']
arr.join # "abc"

Cũng có thể truyền tham số cho join, tham số này là ký tự phân tách.

Ví dụ:

arr = ['a', 'b', 'c']
arr.join("-") # "a-b-c"

Chuyển chuỗi thành Integer

Nếu bạn muốn chuyển chuỗi như "49" thành Integer 49 bạn dùng phương thức to_i.

Ví dụ:

"49".to_i

Lưu ý nếu bạn thử với chuỗi không chứa số bạn sẽ nhận được 0.

Ví dụ:

"a".to_i # 0

Kiểm tra chuỗi có phải số không

Bạn muốn biết chuỗi có chỉ chứa số nguyên không?

Bạn có thể làm:

"123".match?(/\A-?\d+\Z/) # true
"123bb".match?(/\A-?\d+\Z/) # false

Lưu ý: Phương thức match? được giới thiệu trong Ruby 2.4, bạn có thể dùng match (không có dấu hỏi) trên phiên bản cũ.

Mã này dùng biểu thức chính quy, để tôi dịch cho bạn:

“Từ đầu chuỗi (\A) kiểm tra xem có dấu gạch ngang tùy chọn (-?, cho số âm), sau đó đảm bảo có số (\d+) & không có gì khác cho đến cuối chuỗi (\Z).”

Cách nối ký tự (Append)

Bạn có thể xây dựng chuỗi lớn từ chuỗi nhỏ bằng cách nối ký tự vào chuỗi hiện có. Chúng ta cũng gọi đây là nối chuỗi (string concatenation).

Đây là cách dùng phương thức <<:

string = ""
string << "hello"
string << " "
string << "there"
# "hello there"

Đừng dùng += cho nối chuỗi vì đó sẽ tạo chuỗi mới mỗi lần, không tốt cho hiệu suất!

Duyệt qua các ký tự của chuỗi trong Ruby

Đôi khi hữu ích để làm việc với từng ký tự của chuỗi.

Một cách là dùng phương thức each_char:

"rubyguides".each_char { |ch| puts ch }

Bạn cũng có thể dùng phương thức chars để chuyển chuỗi thành mảng ký tự. Sau đó dùng each trên mảng này để duyệt.

Ví dụ:

array_of_characters = "rubyguides".chars # ["r", "u", "b", "y", "g", "u", "i", "d", "e", "s"]

Cách chuyển chuỗi thành chữ hoa hoặc chữ thường trong Ruby

Nếu bạn muốn chuyển chuỗi thành toàn bộ chữ hoa bạn dùng phương thức upcase.

Ví dụ:

"abcd".upcase # "ABCD"

Và nếu bạn muốn chuyển thành chữ thường bạn dùng downcase.

Ví dụ:

"ABCD".downcase # "abcd"

Cách tạo chuỗi đa dòng (Multiline Strings)

Bạn có thể tạo chuỗi đa dòng theo hai cách khác nhau.

Một là dùng heredocs:

b = <<-STRING
aaa
bbb
ccc
STRING

Và cách khác là dùng %Q:

a = %Q(aaa
bbb
ccc )

Cách thay thế văn bản trong chuỗi dùng phương thức Gsub

Nếu bạn muốn thay thế văn bản trong chuỗi dùng phương thức gsub.

Thay từ “dogs” thành “cats”:

string = "We have many dogs"
string.gsub("dogs", "cats") # "We have many cats"

Nếu bạn muốn xóa chuỗi dùng chuỗi rỗng làm tham số thứ 2.

Ví dụ:

string = "abccc"
string.gsub("c", "") # "ab"

Bây giờ:

Phương thức gsub trả về chuỗi mới.

Nếu bạn muốn áp dụng thay đổi vào chuỗi gốc bạn dùng phương thức gsub!.

Phương thức gsub cũng nhận biểu thức chính quy làm tham số nên bạn có thể thay thế mẫu thay vì từ chính xác.

Ví dụ:

string = "We have 3 cats"
string.gsub(/\d+/, "5") # "We have 5 cats"

Điều này thay thế tất cả số (\d+) trong chuỗi bằng số 5.

Một cách nữa dùng phương thức này, với block:

title = "the lord of the rings"
title.gsub(/\w+/) { |word| word.capitalize } # "The Lord Of The Rings"

Còn gsub vs sub?

Vâng, sub giống gsub, nhưng chỉ thay thế khớp đầu tiên.

Gsub thay thế TẤT CẢ khớp.

Cách xóa ký tự cuối cùng khỏi chuỗi

Nếu bạn hỏi người dùng input (dùng Kernel#gets) bạn sẽ có ký tự newline (\n) ở cuối chuỗi, điều này ngăn bạn so sánh chuỗi trực tiếp.

Ví dụ:

puts "What's your name?"
name = gets # gõ gì đó...

Cách tốt nhất xóa newline thừa (\n) là dùng phương thức chomp.

Ví dụ:

name = gets.chomp

Kể từ Ruby 2.3 phương thức chomp nhận tham số tùy chọn cho phép xóa ký tự bạn muốn.

Ví dụ:

"abcd?".chomp("?") # "abcd"

Và nếu ký tự không có nó sẽ trả về chuỗi gốc.

Cách thay đổi Encoding chuỗi

Chuỗi được lưu trữ như chuỗi byte, chúng biến thành ký tự bạn thấy dựa trên encoding.

Ví dụ, số 65 trong encoding ASCII đại diện cho chữ “A”.

Nhưng cũng có encoding phức tạp hơn, như UTF-8, cho phép biểu diễn ký tự từ ngôn ngữ khác (Tiếng Trung, v.v.) & thậm chí emoji.

Để biết encoding hiện tại của chuỗi bạn dùng phương thức encoding.

"abc".encoding # Encoding:UTF-8

Khi đọc file từ đĩa hoặc tải dữ liệu từ web bạn có thể gặp vấn đề encoding.

Bạn thường khắc phục bằng cách ép buộc encoding.

Như sau:

"abc".force_encoding("UTF-8")

Đếm ký tự

Bạn có thể đếm bao nhiêu lần ký tự xuất hiện trong chuỗi dùng phương thức count.

Ví dụ:

str = "aaab"
str.count("a") # 3
str.count("b") # 1

Tóm tắt

Bạn đã học về nhiều phương thức string, như join & split để tách chuỗi thành mảng, gsub để thay thế văn bản trong chuỗi & strip để trim khoảng trắng thừa.

Vì bạn có thể muốn tham khảo trang này sau hãy bookmark & chia sẻ với tất cả bạn bè Ruby của bạn 🙂

Cảm ơn bạn đã đọc!