2012-08-22 37 views
20

Tôi muốn vá một số dữ liệu văn bản được trích xuất từ ​​các trang web. mẫu:Làm thế nào để đáp lại trong biểu thức chính quy Ruby (regex) với gsub khi tôi sử dụng nhóm?

t="First sentence. Second sentence.Third sentence." 

Không có dấu cách sau điểm ở cuối câu thứ hai. Điều này cho tôi biết câu thứ 3 nằm trong một dòng riêng biệt (sau thẻ br) trong tài liệu gốc.

Tôi muốn sử dụng regexp này để chèn ký tự "\ n" vào vị trí thích hợp và sửa văn bản của tôi. regex của tôi:

t2=t.gsub(/([.\!?])([A-Z1-9])/,$1+"\n"+$2) 

Nhưng tiếc là nó không hoạt động: "NoMethodError: Phương pháp xác định` +' cho nil: NilClass" Làm thế nào tôi có thể đúng backreference đến nhóm phù hợp? Thật dễ dàng trong Microsoft Word, tôi chỉ phải sử dụng \ 1 và \ 2 biểu tượng.

+2

Tổng số được đánh số ('$ 1',' $ 2', ...) không được đặt khi đối số thứ hai được đánh giá, chúng được đặt bởi 'gsub' trước khi nó mang lại khối. Do đó, lời khuyên của sawa về thời điểm sử dụng ''\ 1'' và khi nào sử dụng' $ 1'. –

Trả lời

27

Bạn có thể trả lại chuỗi thay thế bằng \1 (để khớp nhóm chụp 1).

t = "First sentence. Second sentence.Third sentence!Fourth sentence?Fifth sentence." 
t.gsub(/([.!?])([A-Z1-9])/, "\\1\n\\2") # => "First sentence. Second sentence.\nThird sentence!\nFourth sentence?\nFifth sentence." 
19
  • Nếu bạn đang sử dụng gsub(regex, replacement), sau đó sử dụng '\1', '\2' ... để đề cập đến trận đấu. Đảm bảo không đặt dấu ngoặc kép xung quanh replacement hoặc thoát khỏi dấu gạch chéo ngược như trong câu trả lời của Joshua. Việc chuyển đổi từ '\1' sang trận đấu sẽ được thực hiện trong phạm vi gsub, chứ không phải bằng cách diễn giải theo nghĩa đen.
  • Nếu bạn đang sử dụng gsub(regex){replacement}, sau đó sử dụng $1, $1 ...

Nhưng đối với trường hợp của bạn, nó là dễ dàng hơn không sử dụng các trận đấu:

t2 = t.gsub(/(?<=[.\!?])(?=[A-Z1-9])/, "\n") 
+1

Anh ấy sẽ phải sử dụng dấu ngoặc kép để lấy dòng mới hoặc ''\ 1' +" \ n "+ '\ 2''. –

+0

@muistooshort OP ban đầu sử dụng '+', vì vậy những gì bạn đưa ra là những gì tôi có trong đầu. – sawa

6

Nếu bạn đến đây vì Rubocop phàn nàn "Tránh sử dụng backrefs kiểu Perl". khoảng $ 1, $ 2, vv ... bạn có thể có thể làm điều này thay vì:

some_id = $1 
# or 
some_id = Regexp.last_match[1] if Regexp.last_match 

some_id = $5 
# or 
some_id = Regexp.last_match[5] if Regexp.last_match 

Nó cũng sẽ muốn bạn làm

%r{//}.match(some_string) 

thay vì

some_string[//] 

Lame (Rubocop)

Các vấn đề liên quan