2010-04-05 3 views
0

строка в вопросе (чтение из файла):Странный Рубин Строка Выбор

if (true) then 
{ 
    _this = createVehicle ["Land_hut10", [6226.8901, 986.091, 4.5776367e-005], [], 0, "CAN_COLLIDE"]; 
    _vehicle_10 = _this; 
    _this setDir -2.109278; 
};

Источник из большого списка подобных (все тот же файл) строк с помощью следующих действий:

get_stringR(string,"if","};")

а код функции:

def get_stringR(a,b,c) 
    b = a.index(b) 
    b ||= 0 
    c = a.rindex(c) 
    c ||= b 
    r = a[b,c] 
    return r 
end

Как до сих пор, это работает отлично, но ш шляпа, которую я хотел сделать, это выбрать массив после «createVehicle», следующий (я думал) должен работать.

newstring = get_string(myString,"\[","\];")

Примечания get_string такого же, как get_stringR, за исключением того, что использует первое вхождение шаблона оба раза, а затем первое и последнее вхождение.

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

["Land_hut10", [6226.8901, 986.091, 4.5776367e-005], [], 0, "CAN_COLLIDE"];

Вместо этого он был ниже, дается через «пут»:

["Land_hut10", [6226.8901, 986.091, 4.5776367e-005], [], 0, "CAN_COLLIDE"]; 
    _vehicle_10 = _this; 
    _this setDir

около 40 символов мимо точки она должна иметь получить, что было очень странно. .. Второе примечание, используя как get_string, так и get_stringR произвел точно такой же результат с указанными параметрами.

Затем я решил добавить следующее к моему get_string код:

 b = a.index(b) 
    b ||= 0 
    c = a.index(c) 
    c ||= b 
    if c > 40 then 
     c -= 40 
    end 
    r = a[b,c] 
    return r

И это работает, как ожидалось (для каждого «блока» в файле, даже если строки после этого массива не являются идентичными в любом путь), но что-то явно не правильно :).

ответ

2

Вы хотите, чтобы r = a [b..c] вместо r = a [b, c].

Разница: b..c = начать с b, перейти к c, а b, c = начать с b и переместить c символов вправо.

Редактировать: Вам не нужно/не должно выходить из [и], потому что вы используете строки, а не регулярные выражения. Кроме того, вы должны учитывать длину конца («];»), иначе вы отделите части конца.

def get_stringR(a,b,c) 
    bp = a.index(b) || 0 
    cp = a.rindex(c) || bp 
    r = a[bp..cp + c.size - 1] 
    return r 
end 

def get_string(a,b,c) 
    bp = a.index(b) || 0 
    cp = a.index(c) || bp 
    r = a[bp..cp + c.size - 1] 
    return r 
end 
+0

спасибо, друг! Почему c.size? Разве это не должно быть. И если так ... почему? – dcousens

+0

Если бы мы имели строку «ABCDE» и разделители «а» и «де», то строка # индексных вызовы приведут в следующем диапазоне: ABCDE ^ -^ Это происходит потому, что строка # индекс возвращается исходное положение матча. Таким образом, мы должны добавить длину заключительного разделителя (минус один) в конец, чтобы получить всю подстроку. Редактировать: meh, no newlines/форматирование комментариев? Надеюсь, вы получите то, что я имею в виду, тем не менее, –

+0

Да, я сделал, спасибо за помощь! – dcousens

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