trả lời
Sử dụng một biểu hiện tích cực lookbehind thường xuyên (ví dụ ?<=
) bên trong một nhóm chụp ngoặc để giữ delimiter vào cuối mỗi chuỗi:
content.split(/(?<=[?.!])/)
# Returns an array with:
# ["Do you like to code?", " How I love to code!", " I'm always coding."]
Điều này khiến một khoảng trắng ở đầu chuỗi thứ hai và thứ ba. Thêm một trận đấu cho zero hoặc nhiều không gian trắng (\s*
) sau khi nhóm chụp để loại trừ nó:
content.split(/(?<=[?.!])\s*/)
# Returns an array with:
# ["Do you like to code?", "How I love to code!", "I'm always coding."]
Ghi chú bổ sung
Trong khi nó không có ý nghĩa với ví dụ của bạn, dấu phân cách có thể được chuyển sang phía trước của chuỗi bắt đầu bằng chuỗi thứ hai. Điều này được thực hiện với biểu thức chính quy nhìn chung tích cực (ví dụ: ?=
). Vì lợi ích của bất cứ ai tìm kiếm kỹ thuật đó, dưới đây là cách để làm điều đó:
content.split(/(?=[?.!])/)
# Returns an array with:
# ["Do you like to code", "? How I love to code", "! I'm always coding", "."]
Một ví dụ tốt để minh họa cho hành vi này là:
content = "- the - quick brown - fox jumps"
content.split(/(?=-)/)
# Returns an array with:
# ["- the ", "- quick brown ", "- fox jumps"]
ý rằng nhóm chụp khung vuông là không cần thiết vì chỉ có một dấu phân tách. Ngoài ra, kể từ khi trận đấu đầu tiên xảy ra ở ký tự đầu tiên nó kết thúc như là mục đầu tiên trong mảng.
Vì vậy, về cơ bản bạn muốn đặt dòng mới sau mỗi dấu phân cách? Giá trị thực tế bạn muốn được trả lại (trong mã Ruby) là gì? – Agis
Tôi không chắc ý nghĩa của việc đó (tức là đặt một dòng mới sau mỗi dấu phân tách) là cách tôi sẽ trình bày dữ liệu. Vì 'split' trả về kết quả trong một mảng, tôi muốn dấu chấm câu được bao gồm với mỗi câu trong phần tử của mảng sao cho khi tôi in các phần tử của mảng một cách riêng biệt, chúng có ý nghĩa với dấu chấm câu. – BrainLikeADullPencil