2010-06-25 2 views
1

Я работаю над ОЧЕНЬ простым скриптом, чтобы очистить несколько сотен тысяч маленьких XML-файлов. Мой текущий метод состоит в том, чтобы перебирать каталог и (для каждого файла) читать файл, использовать String::gsub!, чтобы внести все мои изменения (не уверен, что это лучше всего), а затем я пишу новое содержимое в файл. Мой код выглядит примерно так:Ruby String :: gsub! неожиданно приостанавливается

Dir.entries('.').each do |file_name| 

    f = File.read(file_name) 

    f.gsub!(/softwareiconneedsshine>(.|\s)*<\/softwareiconneedsshine>/i, '') 
    f.gsub!(/<rating>(.|\s)*<\/rating>, '') 

    f.gsub!(/softwareIdentifiers>/, 'version_history>') 

    #some more regex's 

    File.open(file_name, 'w') { |w| w.write(f) } 

end 

все это выглядит великолепно, но по какой-то причине (что я, для жизни меня, не могу понять) программа зависает, казалось бы, произвольно на gsub! команд, аналогичны показанным первым двум. Однако он зависает случайно (но только в тех точках). Иногда это работает, другие времена просто зависают. Я действительно не могу понять, почему это будет работать иногда, но не во все другие времена ???

Любая помощь очень ценится !!

ответ

3

Не зная ничего о своей среде или типе файлов, которые вы читаете, я предлагаю попытаться сделать ваши звезды клейны неживыми. Вроде, измените (.|\s)* на (.|\s)*?

+0

Это работало на удивление хорошо, скрипт выполнен безупречно! Но не могли бы вы объяснить мне, что именно это произошло, я все еще не уверен, что происходит? Благодаря! – 2010-06-25 17:28:48

+0

Подробнее см. Описания '*' и '*?' Здесь: http://www.regular-expressions.info/reference.html – bta

+3

Соответствие «Жадный» начинается с максимально возможного совпадения и сжимает его до тех пор, пока он не найдет правильное совпадение. Совпадение «Lazy» начинается с наименьшего возможного совпадения и расширяет его. Например, возьмите строку 'abc" def "" ghi "jkl'. «Жалкое» регулярное выражение ''. * "' Будет соответствовать '' def "" ghi "' и 'lazy' regex '.. *?" 'Будет соответствовать' 'def' '. – bta

Смежные вопросы