2010-04-05 73 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_stringget_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个字符。

编辑:你不必/也不应该逃避[和],因为你使用的是字符串而不是正则表达式。另外,你必须考虑结尾的长度(“];”),否则你会截断末尾的一部分。

​​
+0

谢谢队友!为什么c.size?它不应该是一个大小?如果是这样......为什么? – dcousens 2010-04-05 11:58:22

+0

如果我们有字符串“abcde”和分隔符“a”和“德”,那么字符串#指数调用会导致以下范围: ABCDE ^ -^ 这是因为字符串#指数收益率比赛的起始位置。 所以我们必须在最后加上结束分隔符的长度(减1)来得到整个子串。 编辑:meh,在评论中没有新行/格式化?我希望你明白我的意思 – 2010-04-05 12:16:04

+0

是的,我做了,感谢您的帮助! – dcousens 2010-04-05 14:10:03