如何在Ruby中的子字符串后删除某个字符

时间:2016-11-03 17:49:39

标签: ruby string

我有一个带感叹号的字符串。我想删除单词末尾的感叹号,而不是单词之前的感叹号。假设没有感叹号/没有一个字。我的意思是[a..z],可以是大写的。

例如:

exclamation("Hello world!!!")
#=> ("Hello world")

exclamation("!!Hello !world!")
#=> ("!!Hello !world")

我看过How do I remove substring after a certain character in a string using Ruby?;这两个是接近的,但不同。

def exclamation(s)
  s.slice(0..(s.index(/\w/)))
end

# exclamation("Hola!") returns "Hol"

我也试过s.gsub(/\w!+/, '')。虽然它在单词之前保留'!',但它会删除两个最后一个字母和感叹号。 exclamation("!Hola!!") #=> "!Hol"

如何只删除末尾的感叹号?

3 个答案:

答案 0 :(得分:1)

虽然您还没有提供大量测试数据,但这里有一些可行的示例:

def exclamation(string)
  string.gsub(/(\w+)\!(?=\s|\z)/, '\1')
end

\s|\z部分表示字符串的空格或结尾,而(?=...)表示只是在字符串中向前窥视但实际上不匹配它。

请注意,如果感叹号与某个空格不相邻,"I'm mad!"之类的内容不会起作用,但您可以将其添加为另一个潜在的词尾匹配。

答案 1 :(得分:1)

"!!Hello !world!, world!! I say".gsub(r, '')
  #=> "!!Hello !world, world! I say"

,其中

r = /
    (?<=[[:alpha:]])  # match an uppercase or lowercase letter in a positive lookbehind
    !                 # match an exclamation mark
    /x                # free-spacing regex definition mode

r = /
    [[:alpha:]]       # match an uppercase or lowercase letter
    \K                # discard match so far
    !                 # match an exclamation mark
    /x                # free-spacing regex definition mode

如果上面的示例应该返回"!!Hello !world, world I say",请在正则表达式中将!更改为!+

答案 2 :(得分:1)

如果您不想使用有时难以理解的正则表达式,请使用:

def exclamation(sentence)
  words = sentence.split
  words_wo_exclams = words.map do |word|
    word.split('').reverse.drop_while { |c| c == '!' }.reverse.join
  end
  words_wo_exclams.join(' ')
end