用gsub替换Ruby中的s字符串

时间:2015-06-25 13:09:37

标签: ruby gsub

我有一个字符串

path = "MT_Store_0  /47/47/47/opt/47/47/47/data/47/47/47/FCS/47/47/47/oOvt4wCtSuODh8r9RuQT3w"

我想使用/47从第一个gsub删除字符串的一部分。

path.gsub! '/47/', '/'

预期产出:

"MT_Store_0  "

实际输出:

"MT_Store_0  /47/opt/47/data/47/FCS/47/oOvt4wCtSuODh8r9RuQT3w"

3 个答案:

答案 0 :(得分:2)

path.gsub! /\/47.*/, ''

在正则表达式中,\/47.*匹配/47及其后的任何字符。

或者,您可以使用%r编写正则表达式以避免转义正斜杠:

path.gsub! %r{/47.*}, ''

答案 1 :(得分:0)

如果输出必须为MT_Store_0

然后gsub( /\/47.*/ ,'' ).strip就是你想要的

答案 2 :(得分:0)

以下是两个既不使用Hash#gsub也不使用Hash#gsub!的解决方案。

使用String#index

def extract(str)
  ndx = str.index /\/47/
  ndx ? str[0, ndx] : str
end

str = "MT_Store_0  /47/47/oOv"
str = extract str
  #=> "MT_Store_0  "

extract "MT_Store_0 cat"
  #=> "MT_Store_0 cat"

使用捕获组

R = /
    (.+?)  # match one or more of any character, lazily, in capture group 1
    (?:    # start a non-capture group 
      \/47 # match characters
      |    # or
      \z   # match end of string
    )      # end non-capture group
    /x     # extended mode for regex definition

def extract(str)
  str[R, 1]
end

str = "MT_Store_0  /47/47/oOv"
str = extract str
  #=> "MT_Store_0  "

extract "MT_Store_0  cat"
  #=> "MT_Store_0  cat"