在Ruby中解析此字符串的最快方法

时间:2018-03-13 23:06:25

标签: ruby

我目前正在寻找在Ruby中解析字符串的最快方法。该字符串的格式为:

  

“#{String1}>#{String2}(#{Integer})”,例如“Hello> World(25)”

我希望从中检索String1,String2和Integer的值。我目前的做法只是

s1 = "Hello"
s2 = "World"
i = 25
str = "#{s1}>#{s2}(#{i})"
str = str.split('>')
newStr = str[1].split('(')
str[1] = newStr[0]
str[2] = newStr[1].chomp(')').to_i
print(str)   # => ["Hello", "World", 25]`

我正在寻找比这更快的方法来加速我的程序。感谢。

4 个答案:

答案 0 :(得分:1)

您可以使用正则表达式捕获组来获取这些值:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="clock">
  <div id="hr"></div>
  <div id="min"></div>
</div>

答案 1 :(得分:1)

字符串partition method甚至比split方法更快。

str = "Hello>World(25)"

a, _, b = str.partition('>')
b, _, c = b.partition('(')
c = c.to_i

puts a, b, c

答案 2 :(得分:0)

您可以在#split方法中使用正则表达式来实现相同的结果:

string = "Hello>World(25)"
result = string.split(/[>,()]/)
result[-1] = result[-1].to_i

result
# => ["Hello", "World", 25]

希望这有帮助!

答案 3 :(得分:0)

如果你想要速度超过可读性,你可能真的接近你将要获得的最快速度。通过将可选的limit参数传递给split并省略了不需要的chomp(')'),我可以节省一些实施时间:

  # Way #1
  str = str.split('>', 2)
  newStr = str[1].split('(', 2)
  str[1] = newStr[0]
  str[2] = newStr[1].to_i

或者,在大约相同的速度下(某些运行速度更快,其他运行速度更慢):

  # Way #2
  str = str.split(/[>(]/, 3)
  str[2] = str[2].to_i