2012-08-22 16 views
20

Web sayfalarından çıkarılan bazı metin verilerini yamayı isterim. örnek:Gruplama kullandığımda Ruby düzenli ifadesinde (regex) gsub ile nasıl geri alınır?

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

ikinci cümlenin sonuna noktadan sonra boşluk yoktur. Bu, 3. cümlenin orijinal belgede ayrı bir satırda (br etiketinden sonra) olduğunu işaret ediyor.

"\ n" karakterini uygun yerlere eklemek ve metnimi yapıştırmak için bu regexp'i kullanmak istiyorum. Benim regex:

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

Ama ne yazık ki çalışmıyor: "NoMethodError: tanımsız yöntem` +' nil için: NilClass" nasıl düzgün bir eşleştirilmiş gruplara bir geriye edebilir? Microsoft Word'de bu kadar kolaydı, \ 1 ve \ 2 sembollerini kullanmak zorunda kaldım.

+2

Numaralandırılmış globals ('$ 1',' $ 2', ...) ikinci argüman değerlendirildiğinde ayarlanmaz; bunlar gsub' tarafından bloğa verilmeden önce ayarlanır. Bu nedenle, '' \ 1 '' ne zaman kullanılacağını ve '$ 1' değerini ne zaman kullanacağına dair sawa'nın tavsiyesi. –

cevap

27

\1 ile (yedek yakalama grubu 1'i eşleştirmek için) yedek dizede geri tepsiniz.

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
  • Eğer gsub(regex, replacement) kullanıyorsanız, o zaman '\1', '\2' ... maçın başvurmak için kullanın. replacement'un etrafına çift tırnak koymadığınızdan emin olun, aksi takdirde Joshua'nın cevabındaki gibi ters eğik çizgi kaçının. Maça '\1' arasındaki dönüşüm, gerçek yorumla değil, gsub içinde yapılacaktır.
  • Eğer gsub(regex){replacement} kullanıyorsanız, o zaman $1, $1 ...

Ama senin için, maçları kullanmamaya kolaydır kullanın: Burada amacımız

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

Yeni satırı almak için çift tırnak kullanmalı veya '' \ 1 '+ "\ n" + "\ 2''. –

+0

@muistooshort OP orijinal olarak '+' kullanıyor, bu yüzden ne yaptığınızı aklımda geçirdim. – sawa

6

yüzünden Rubocop "Perl tarzı backrefs kullanımını önlemek" şikayetçi. yaklaşık vb $ 1, $ 2, ... yerine bunu yapabilirsiniz edebilirsiniz:

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 

Ayrıca

some_string[//] 

Lame

%r{//}.match(some_string) 

yerine

yapmak isteyeceksiniz (Rubocop