处理代码战争挑战,以删除字符串中除结尾之外的所有感叹号。到目前为止,我已经尝试了一些正则表达式,幸运的是我没有收到任何错误消息,因此它至少将我的代码识别为有效表达式。
def remove(s)
s.gsub(/s+/, "!")
end
我能否获得一些关于如何编写此正则表达式以从字符串中的其他位置删除"!"(最后)的意见?如果我也可以得到一个没有正则表达式的方法,那将是极好的,因为正则表达式可能有点令人困惑。
作为参考,这是测试应该的样子:
Test.describe("Basic tests") do
Test.assert_equals(remove("Hi!"),"Hi!")
Test.assert_equals(remove("Hi!!!"),"Hi!!!")
Test.assert_equals(remove("!Hi"),"Hi")
Test.assert_equals(remove("!Hi!"),"Hi!")
Test.assert_equals(remove("Hi! Hi!"),"Hi Hi!")
Test.assert_equals(remove("Hi"),"Hi")
end
删除所有!
,但字符串末尾的所有
s.gsub(/!(?!!*z)/, "")
请参阅 Rubular 演示和正则表达式 101 演示(转换为 PCRE 以处理多行字符串)。
详
!
- 匹配!
符号(?!
- 与未紧随其后的位置匹配的负面前瞻的开始:!*
- 零个或多个!
字符,最多z
- 字符串的结尾
)
- 展望结束。
您可以扩展正则表达式以替换任何标点符号字符,除非在字符串末尾:
s.gsub(/([[:punct:]])(?![[:punct:]]*z)/, "")
其中[[:punct:]]
匹配任何标点符号字符(可以替换为[p{P}p{S}]
)。
非正则表达式:取除最后一个字符以外的字符串,从中删除感叹号,重新添加最后一个字符。
def remove(str)
return "" if str.empty? # defend against nil-errors
str[0..-2].delete("!") + str[-1]
end