【问题标题】:Select all characters in a string until a specific character Ruby选择字符串中的所有字符,直到特定字符 Ruby
【发布时间】:2022-01-03 23:15:45
【问题描述】:

所以我想要的是得到 n 个字符,直到它碰到一个特定的字符。

我有这个字符串:

a='2.452811139617034,42.10874821716908|3.132087902867818,42.028314077306646|-0.07934861041448178,41.647538468746916|-0.07948265046522918,41.64754863599606'

我怎样才能让它只到达角色 | ,但没有得到那个字符, 并得到它:

2.452811139617034,42.10874821716908

【问题讨论】:

  • 如果字符串不包含竖线字符('|'),您希望返回什么?
  • @CarySwoveland 好问题。在这种情况下,我需要在我的答案中添加一个逻辑操作,而你不会。

标签: ruby string visual-studio


【解决方案1】:

您可以通过使用避免创建不必要的数组(如Array#split)或使用正则表达式(如Array#gsub)。

a = "2.452811139617034,42.10874821716908|3.132087902867818,42.028314077306646|-0.07934861041448178,41.647538468746916|-0.07948265046522918,41.64754863599606"

a[0,a.index('|')]
#=>"2.452811139617034,42.1087482171"

这意味着选择位置 0 到第一个管道索引 (|) 的字符。从技术上讲,它从位置 0 开始并选择 n 的长度,其中 n 是在这种情况下有效的管道字符的索引,因为 ruby​​ 使用基于 0 的索引。

正如@CarySwoveland 敏锐地指出的那样,字符串可能不包含管道,在这种情况下,我的解决方案需要更改为

#to return entire string
a[0,a.index('|') || a.size]
# or
b = a.index(?|) ? a[0,b] : a
# or to return empty string
a[0,a.index('|').to_i]
# or to return nil
a[0,a.index(?|) || -1]

【讨论】:

  • 有趣。我没有意识到我们可以这样使用string[]。或者,我们也可以使用a[0…a.index("|")],这似乎更熟悉一些。
  • @MichaelB 但它创建了一个 Range,这也是不必要的对象创建,我认为独占(三点)范围并不是那么熟悉
【解决方案2】:

你可以这样做:

a.split('|').first

【讨论】:

  • 我建议使用 partition 而不是 split 。分区将停止查看第一个匹配项,而拆分将继续贯穿整个字符串。
  • @MichaelB - 这很容易用split('|', 2)“修复”,但我认为性能提升不会很明显(除非字符串真的很长......)
【解决方案3】:
a[/[^|]+/]
  #=> "2.452811139617034,42.10874821716908"

正则表达式只匹配除'|' 之外的尽可能多的字符。

【讨论】:

    【解决方案4】:

    我总是对各种选项的性能感到好奇,因此我冒昧地循环浏览了一些建议的方法。我将它们命名如下:

    split_all = a.split('|').first
    partition = a.partition('|').first
    split_two = a.split('|', 2).first
    string_brack_args = a[0,a.index('|')]
    string_brack_range = a[0...a.index('|')]
    gsub_regex = a.gsub(/\|.*$/, "")
    plain_regex = a[/[^|]+/]
    

    结果如下(顶部最慢):

       user     system      total        real
    gsub_regex           0.170000   0.000000   0.170000 (  0.162666)
    split_all            0.110000   0.000000   0.110000 (  0.109498)
    split_two            0.040000   0.000000   0.040000 (  0.041792)
    partition            0.040000   0.000000   0.040000 (  0.037161)
    string_brack_range   0.030000   0.000000   0.030000 (  0.034021)
    plain_regex          0.040000   0.000000   0.040000 (  0.033468)
    string_brack_args    0.020000   0.000000   0.020000 (  0.022455)
    

    在最慢和最快之间,效率几乎提高了八倍。即使是一些小事情也会产生巨大的影响。诚然,我循环了这 100_000 次,所以对于一个实例来说差异非常小,但即使使用 split(str, 2)split(str) 之类的简单方法也快两倍多。事实上,所列方法中速度较快的一半平均是速度较慢的一半的 3 倍。

    【讨论】:

      【解决方案5】:

      一种方法使用gsub 替换:

      a = "2.452811139617034,42.10874821716908|3.132087902867818,42.028314077306646|-0.07934861041448178,41.647538468746916|-0.07948265046522918,41.64754863599606"
      output = a.gsub(/\|.*$/, "")
      puts output  # 2.452811139617034,42.10874821716908
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-08
        • 1970-01-01
        • 1970-01-01
        • 2014-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多