2017-02-20 21 views
-2

Я реализовал сценарий ruby, который должен генерировать &, вставить фрагменты кода по умолчанию в нужные места. Проблема в том, что некоторые из этих фрагментов кода должны учитывать алфавитный порядок существующего кода.regex вставить слово в текст в алфавитном порядке

В качестве примера, предположим, что нам нужно вставить кусок кода для слова «палец» (в данном случае это будет UPDATEFIELD((&(thumb)), ([custominputstream readString]));) в следующий код:

//... 
    UPDATEFIELD((&(answers)), ((ListTO *)[custominputstream readCustomSerializable])); 
    UPDATEFIELD((&(text)), ([custominputstream readString])); 
    UPDATEFIELD((&(title)), ([custominputstream readString])); 
    //... 

желанный результат является:

//... 
    UPDATEFIELD((&(answers)), ((ListTO *)[custominputstream readCustomSerializable])); 
    UPDATEFIELD((&(text)), ([custominputstream readString])); 
    UPDATEFIELD((&(thumb)), ([custominputstream readString])); //here is the right place to do it. 
    UPDATEFIELD((&(title)), ([custominputstream readString])); 
    //... 

вопрос заключается в том, чтобы найти это точное место для вставки текста с регулярным выражением/это вообще возможно?

+0

Покажите нам, что вы уже пробовали. – mudasobwa

+0

@mudasobwa Я не нашел ничего, связанного с моей проблемой в документах, поэтому ничего не показывать. – nrx

+0

Программирование не касается решений для копирования в документах/SO, это решение проблем. – mudasobwa

ответ

0

текущий порядок слов

answers < text < title 

подход к проблеме может читать файл из верхней и разбив его в центре.

в вашем случае является

UPDATEFIELD((&(text)), ([custominputstream readString]));

читать

/(?<=UPDATEFIELD\(\(&\()\w+(?=\))/ строку , которая является ничем иным, text

, а затем сравнить его с вашим словом. Что в вашем случае случается thumb

if 'thumb' < 'text' 
    #place it above text 
else #(which is obvious) then 
    #place it below 
end 

заказ становится

answers < text < thumb < title 

Ваш файл достаточно большой, поэтому вам, возможно, придется повторить то же самое упражнение, пока вы не достигнете своей цели.

Мы делаем binary search, чтобы добраться до места, где мы должны вставить наше слово.

+0

Спасибо за такой быстрый ответ, похоже, что это именно то, что мне нужно! Теперь мне нужно некоторое время, чтобы применить его, потому что я полный noob как в регулярном выражении, так и в ruby; Я напишу + согласиться с ответом как можно скорее :) – nrx

+0

hmm ... Я не могу получить, как вставить строку непосредственно над/под линией с совпадением. Раньше в таких случаях я использовал этот подход 'def dataAppendTo (methodName, string, data, bottomEdge) \t return data.sub /(-.*#{methodName}.*\n)((.*\n) *?) (. * # {bottomEdge}. *) /, '\ 1 \ 2' + string + ' \ 4' конец' , чтобы вставить новые строки, но здесь он, похоже, не применим. – nrx

+0

Я думаю, что один простой способ сделать это - прочитать ваш файл в виде строки и разделить на «\ n» или «\ n \ r» и найти индекс требуемого слова и вставить новое слово с помощью 'array. insert (index, word) 'Надеюсь, это поможет – aelor