Странная рубиновая строка - PullRequest
0 голосов
/ 05 апреля 2010

Строка в вопросе (считывается из файла):

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

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

1 Ответ

2 голосов
/ 05 апреля 2010

Вы хотите 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...