-2

test_arrayで分割された文字列を含む配列があります.split(' ')。したがって、各アイテムの最後の文字は、、、'.'およびその他の単語以外のタイプに'-'することができます。'!'目標は、この文字をソースの後に別の項目として配列に挿入し、この文字をソースから削除することです。

l=0
test_array= @test.source.split(' ') 
test_array. each do |f| 
    if f[-1]== /[^\w]/
        test_array.insert(l+1, f[-1]) 
        f=f.chop 
        l+=1 
    else 
        l+=1 
    end 
end

/[^\w]/は、単語以外の文字の正規表現です。
何らかの理由で機能しません。1時間デバッグしようとしても解決策がありません。

UPD たとえば、入力は次のとおりです。

[「その」「パターン」、「である」、「通常」、「a」、「正規表現;」、「if :]

出力は次のようになります。

[「その」「パターン」、「である」、「通常」、「a」、「正規表現」;」、「if」:]

4

2 に答える 2

1

Regexp の場合、=~演算子またはmatchメソッドを使用する必要があるため、コードは次のようになります。

(編集 - 考えてみると、反復が完了する前に配列の最後に単語以外の文字を挿入しているため、これを行うと無限ループが発生するため、取得したアイテムを解析します挿入されたばかりで、たまたま単語以外の文字である..そのため、それを切り取って挿入し直します..など.これを修正するには、代わりに新しい配列を作成する必要があります。以下の回答を更新しました反映します。)

test_array= @test.source.split(' ') 
result_array=[]
test_array.each do |f| 
    if f[-1]=~ /[^\w]/
        result_array << f.chop << f[-1]
    else
        result_array << f
    end
end

テスト:

1.9.3p194 :041 > test_array = ["The" "pattern", "is", "typically", "a", "Regexp;", "if:" ]
 => ["Thepattern", "is", "typically", "a", "Regexp;", "if:"] 
1.9.3p194 :042 > result_array = []
 => [] 
1.9.3p194 :043 > test_array.each{|f| if f[-1]=~ /[^\w]/; result_array << f.chop; result_array << f[-1]; else; result_array << f; end}
 => ["Thepattern", "is", "typically", "a", "Regexp;", "if:"] 
1.9.3p194 :044 > result_array
 => ["Thepattern", "is", "typically", "a", "Regexp", ";", "if", ":"]

ソース

于 2013-03-07T16:22:55.213 に答える
1

String#split正規表現でキャプチャ グループを使用して、単一でこれを行うことができます。

pry(main)> "The pattern is typically a Regexp; if:".split(/([^\w\s])?(?:\s+|$)/)
=> ["The", "pattern", "is", "typically", "a", "Regexp", ";", "if", ":"]

分割正規表現にキャプチャ グループが含まれている場合、それらも結果に返されます。この正規表現は空白で分割され、空白の直前にオプションの非単語/非空白文字がキャプチャされます。

于 2013-03-07T16:51:13.760 に答える