开发者

Strange Ruby String Selection

开发者 https://www.devze.com 2022-12-25 11:56 出处:网络
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\"];

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 p开发者_如何学运维arameters 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 :).


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
0

精彩评论

暂无评论...
验证码 换一张
取 消