2013-03-07 2 views
-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]/ является регулярным выражением любого не-символа слова.
По какой-то причине он не работает. Попытка отладки в течение часа и никакого решения.

UPD Например, вход:

[ "The" "образец", "является", "обычно", "а", "Regexp ;", "если :" ]

Вывод должен быть:

[ "The" "образец", "является", "обычно", "а", "Regexp" , ";", "если" , ":" ]

+1

Можете ли вы привести пример ввода, который вы даете ему, ожидаемый результат и вывод, который вы получаете? – varatis

+0

отредактированный вопрос –

+0

BTW '\ W' - это более простой способ сказать' [^ \ w] 'в regexp. – dbenhur

ответ

1

Для Regexp вам нужно использовать =~ оператор или метод match, так что ваш код станет:

(Edit - Думая об этом, вы получите бесконечный цикл, делая это, потому что вы вставляете символ без слова в конце массива, прежде чем закончите итерацию, так что вы проанализируете элемент, который вы только что вставили , который всегда будет символом, отличным от слова, поэтому вы отрубаете его и вставьте его обратно .. и т. д. Чтобы исправить это, вы должны построить новый массив в вместо него, и я обновил свой ответ ниже, чтобы отразить это)

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", ":"] 

sauce

+0

Большое спасибо. Я уже выяснил, что цикл бесконечен, пытаясь запустить) –

1

Вы можете сделать это с помощью одного String#split с использованием захвата группы в ваше регулярное выражение:

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

Когда разделенное регулярное выражение содержит группы захвата, они также возвращаются в результате. Это регулярное выражение разбивается на пробелы, захватывая необязательный символ без слова/не-пробела перед пробелом.

+0

Это пальчик-ликин 'хорошо. –

+0

Удивительный. Но можете ли вы объяснить? между группами? –

+0

@JoeHalfFace '?' Означает 0 или один из предыдущих шаблонов. '/ x? y /' соответствует y, которому предшествует необязательный x. – dbenhur