【问题标题】:Get substring after the first = symbol in Ruby在Ruby中的第一个=符号之后获取子字符串
【发布时间】:2012-12-28 18:04:00
【问题描述】:

纯粹出于好奇,有没有更优雅的方法来简单地获取字符串中第一个 = 符号之后的子字符串?以下作品回馈name=bob

string = "option=name=bob"
string[string.index('=')+1..-1]

感觉不是很Ruby。这也有效:

string.split('=', 2)[1]

再一次,不是很优雅,尤其是因为split 正在做额外的不必要的工作。正则表达式是答案吗?对于在字符串中查找单个字符位置的简单性,我觉得这有点矫枉过正:

string.match('=(.*)')[1]

我不得不想象这是一个非常普遍的情况,不是有string.after('=') 类型的方法吗?考虑到这种操作在网络上的使用频率,Ruby on Rails 是否提供了类似的功能?

UPDATE:忘了说找不到符号的情况,应该返回nil或者空字符串。但是正则表达式机制和.index 方法需要额外检查(不太优雅)。

【问题讨论】:

  • 小字符串上的小正则表达式真的真的快。
  • @AlexWayne - 这让我感觉好多了:),但我想我必须考虑到找不到 = 符号的情况。
  • “更优雅的方式...”问题应在codereview.stackexchange.com提出

标签: ruby string


【解决方案1】:

不完全是.after,但非常接近:

string.partition('=').last

http://www.ruby-doc.org/core-1.9.3/String.html#method-i-partition

【讨论】:

  • 是的,与split 非常相似,我喜欢你使用.last[1](或者在partition 的情况下使用[2]
【解决方案2】:

还有这种方式:

string.partition('=')[2]

还有这个:

string.sub(/.*?=/, '')

不过,我想我更喜欢你提到的正则表达式方式。

【讨论】:

  • .sub 方式比 .match 有优势,即使找不到符号,它也可以工作(如果你想要原始字符串)。
  • 请注意,如果字符串包含"foo\nbar=baz",则正则表达式版本会失败。在这种情况下,您将留下'foobaz'. 不匹配换行符,要启用多行匹配,请使用 m 标志。 /.*?=/m 确实适用于带有换行符的字符串。
【解决方案3】:

可能不是 Ruby 方式(它有点神秘),但你可以这样做:

string[/=/]
$'
=> "name=bob"

/=/ =~ string
$'
=> "name=bob"

$' 是一个全局变量,匹配成功后保存字符串。 nil 如果没有匹配,也是!

【讨论】:

  • 哇,不知道有一个全局变量保存这个。当找不到符号时,这可以正常工作。
  • 好。现在去忘记它;)
  • @Thomas - :)。使用$' 会出现什么问题?不是很漂亮.. Rails 应用程序中的潜在冲突?
  • 为了更清楚,您可以包含english 标准库并使用$POSTMATCH 而不是$'。这还不错,imo。
【解决方案4】:

使用字符串#match

您可以使用正则表达式和正则表达式来查找匹配项。例如:

string = "option=name=bob"
string.match /(?<==).*/
# => #<MatchData "name=bob">

使用匹配变量访问结果

即使您没有将匹配数据分配给变量,Ruby 也会为您将其存储在特殊的 match variables 中。

$&
# => "name=bob"

【讨论】:

    【解决方案5】:

    split(char) 是另一个可以使用的函数。 例如,我们想从 "answer:computer" 中获取 char ':' 之前的子字符串,那么我们可以使用 "answer:computer".split(':')[0]。所以,我们会得到结果为 "answer"。

    【讨论】:

      【解决方案6】:

      您可以使用array decomposition,而不是使用string.split('=', 2)[1]

      # assuming your string represents a key=value pair
      key, value = string.split('=', 2)
      

      虽然这个解决方案不适合单行,但我确实觉得它很干净。

      【讨论】:

        猜你喜欢
        • 2022-10-13
        • 2022-11-16
        • 1970-01-01
        • 2010-12-28
        • 2013-01-25
        • 1970-01-01
        • 2018-06-04
        • 1970-01-01
        • 2021-01-13
        相关资源
        最近更新 更多