【问题标题】:Strange Ruby String Selection奇怪的 Ruby 字符串选择
【发布时间】:2010-04-05 11:18:14
【问题描述】:

有问题的字符串(从文件中读取):

如果(真)那么
{
  _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]
    返回 r
结束

到目前为止,这工作正常,但我想做的是在“createVehicle”之后选择数组,以下(我认为)应该可以工作。

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

注意 get_stringget_stringR 相同,只是它两次都使用模式的第一次出现,而不是第一次和最后一次出现。

输出应该是:

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

相反,它是通过“puts”给出的:

["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
    如果 c > 40 那么
        c -= 40
    结尾
    r = a[b,c]
    返回 r

它按预期工作(对于文件中的每个“块”,即使该数组后面的字符串在任何方面都不相同),但显然有些事情是不对的:)。

【问题讨论】:

    标签: ruby string


    【解决方案1】:

    你想要 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
    

    【讨论】:

    • 谢谢老兄!为什么选择 c.size?不应该是a.size吗?如果是这样……为什么?
    • 如果我们有字符串“abcde”和分隔符“a”和“de”,那么 String#index 调用将导致以下范围:abcde ^--^ 那是因为 String# index 返回匹配的起始位置。所以我们必须将结束分隔符的长度(减一)添加到末尾以获得整个子字符串。编辑:嗯,cmets 中没有换行符/格式?我希望你明白我的意思
    猜你喜欢
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 2021-04-23
    • 2021-12-13
    • 2013-04-09
    • 2011-09-18
    • 2011-10-01
    相关资源
    最近更新 更多