我有一个带感叹号的字符串。我想删除单词末尾的感叹号,而不是单词之前的感叹号。假设没有感叹号/没有一个字。我的意思是[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"
。
如何只删除末尾的感叹号?
答案 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