Helpex - Trao đổi & giúp đỡ Đăng nhập
5

Có ai biết về một viên ngọc Ruby (hoặc tích hợp sẵn, hoặc cú pháp gốc, cho vấn đề đó) hoạt động trên các dấu ngoặc kép bên ngoài của chuỗi không?

Tôi thấy mình đã viết đi viết lại những phương pháp như thế này:

remove_outer_quotes_if_quoted( myString, chars ) -> aString
add_outer_quotes_unless_quoted( myString, char ) -> aString

Các bài kiểm tra đầu tiên myStringđể xem liệu các ký tự bắt đầu và kết thúc của nó có khớp với bất kỳ ký tự nào trong đó hay không chars. Nếu vậy, nó trả về chuỗi có dấu ngoặc kép đã bị loại bỏ. Nếu không, nó trả về nó không thay đổi. charsmặc định là danh sách các ký tự dấu ngoặc kép.

Thử nghiệm thứ hai myStringđể xem liệu nó đã bắt đầu và kết thúc với chưa char. Nếu vậy, nó trả về chuỗi không thay đổi. Nếu không, nó trả về chuỗi có chargắn trước và sau, và bất kỳ lần xuất hiện nhúng nào của charđều được thoát bằng dấu gạch chéo ngược. charmặc định là đầu tiên trong danh sách ký tự mặc định.

(Tất nhiên, các phương pháp viết tay của tôi không có những cái tên dài dòng như vậy.)

Tôi đã tìm kiếm các phương pháp tương tự trong các repo công khai nhưng không thể tìm thấy bất kỳ điều gì như thế này. Tôi có phải là người duy nhất cần phải làm điều này rất nhiều? Nếu không, làm thế nào để những người khác làm điều này?

5 hữu ích 5 bình luận 4.0k xem chia sẻ
5

Nếu bạn làm điều đó nhiều, bạn có thể muốn thêm một phương thức vào String:

class String
  def strip_quotes
    gsub(/\A['"]+|['"]+\Z/, "")
  end
end

Sau đó, bạn có thể chỉ cần gọi string.strip_quotes.

Thêm dấu ngoặc kép cũng tương tự:

class String
  def add_quotes
     %Q/"#{strip_quotes}"/ 
  end
end

Điều này được gọi là string.add_quotesvà sử dụng dải_quotes trước khi thêm dấu ngoặc kép.

5 hữu ích 1 bình luận chia sẻ
2

Điều này có thể giải thích cách xóa và thêm chúng:

str1 = %["We're not in Kansas anymore."]
str2 = %['He said, "Time flies like an arrow, Fruit flies like a banana."']

puts str1
puts str2

puts

puts str1.sub(/\A['"]/, '').sub(/['"]\z/, '')
puts str2.sub(/\A['"]/, '').sub(/['"]\z/, '')

puts 

str3 = "foo"
str4 = 'bar'

[str1, str2, str3, str4].each do |str|
  puts (str[/\A['"]/] && str[/['"]\z/]) ? str : %Q{"#{str}"}
end

Hai dòng ban đầu:

# >> "We're not in Kansas anymore."
# >> 'He said, "Time flies like an arrow, Fruit flies like a banana."'

Tước phần trích dẫn:

# >> We're not in Kansas anymore.
# >> He said, "Time flies like an arrow, Fruit flies like a banana."

Thêm dấu ngoặc kép khi cần:

# >> "We're not in Kansas anymore."
# >> 'He said, "Time flies like an arrow, Fruit flies like a banana."'
# >> "foo"
# >> "bar"
2 hữu ích 1 bình luận chia sẻ
0

Tôi sẽ sử dụng value = value[1...-1] if value[0] == value[-1] && %w[' "].include?(value[0]). Tóm lại, mã đơn giản này kiểm tra xem ký tự đầu tiên và ký tự cuối cùng của chuỗi có giống nhau hay không và loại bỏ chúng nếu chúng là dấu nháy đơn / kép. Ngoài ra, có thể thêm nhiều loại báo giá cần thiết.

%w["adadasd" 'asdasdasd' 'asdasdasd"].each do |value|
  puts 'Original value: ' + value
  value = value[1...-1] if value[0] == value[-1] && %w[' "].include?(value[0])
  puts 'Processed value: ' + value
end

Ví dụ trên sẽ in ra như sau:

Original value: "adadasd"
Processed value: adadasd
Original value: 'asdasdasd'
Processed value: asdasdasd
Original value: 'asdasdasd"
Processed value: 'asdasdasd"
0 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ ruby string quote , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading