views:

59

answers:

1

The string in question (read from a file):

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

Retrieved from a large list of similar (all same file) strings via the following:

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

And the function code:

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

As so far, this works fine, but what I wanted to do is select the array after "createVehicle", the following (I thought) should work.

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

Note get_string is the same as get_stringR, except it uses the first occurrence of the pattern both times, rather then the first and last occurrence.

The output should have been:

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

Instead it was the below, given via 'puts':

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

Some 40 characters past the point it should have retrieve, which was very strange... Second note, using both get_string and get_stringR produced the exact same result with the parameters given.

I then decided to add the following to my get_string code:

   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

And it works as expected (for every 'block' in the file, even though the strings after that array are not identical in any way), but something obviously isn't right :).

+2  A: 

You want r = a[b..c] instead of r = a[b,c].

Difference is: b..c = start from b, go to c, while b,c = start from b and move c characters to the right.

Edit: You don't have to/shouldn't escape the [ and ] either, because you are using strings and not regexen. Also, you have to take the length of the end ("];") into consideration, or you will cut off parts of the end.

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
dominikh
thanks mate! Why c.size? Shouldn't it be a.size? And if so... why?
Daniel
If we had the string "abcde" and the delimiters "a" and "de", then the String#index calls would result in the following range: abcde ^--^ That is because String#index returns the starting position of the match.So we have to add the length of the closing delimiter (minus one) to the end to get the whole substring.Edit: meh, no newlines/formatting in comments? I hope you get what I mean nevertheless
dominikh
yeah I did, thanks for the help!
Daniel