【问题标题】:Ruby: Remove all exclamation marks from sentence except at the endRuby:从句子中删除所有感叹号,除了结尾
【发布时间】:2021-01-03 03:57:54
【问题描述】:

正在处理代码战挑战,以从字符串中删除除结尾之外的所有感叹号。到目前为止,我已经使用了一些正则表达式,幸运的是我没有收到任何错误消息,所以它至少将我的代码识别为有效的表达式。

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

【问题讨论】:

    标签: regex ruby


    【解决方案1】:

    删除所有!,字符串末尾的所有!除外

    s.gsub(/!(?!!*\z)/, "")
    

    查看Rubular demoregex101 demo(转换为PCRE 以使用多行字符串)。

    详情

    • ! - 匹配 ! 符号
    • (?! - negative lookahead 的开头,匹配一个不紧跟其后的位置:
      • !* - 零个或多个 ! 字符最多
      • \z - 字符串结束
    • ) - 前瞻结束。

    您可以扩展正则表达式以替换任何标点字符,除非在字符串末尾:

    s.gsub(/([[:punct:]])(?![[:punct:]]*\z)/, "")
    

    其中[[:punct:]] 匹配任何标点字符(可以替换为[\p{P}\p{S}])。

    【讨论】:

    • 这看起来很混乱但又很干净。真的没有办法避免学习正则表达式吗?感谢您提供详细的细分
    • @KobadaTech 我认为这确实是一个正则表达式的好案例。当然,您可能总是编写自己的解析方法。
    【解决方案2】:

    非正则表达式:取除最后一个字符之外的字符串,从中删除感叹号,重新添加最后一个字符。

    def remove(str)
      return "" if str.empty?  # defend against nil-errors
      str[0..-2].delete("!") + str[-1]
    end
    

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 2012-09-02
      • 2012-10-15
      • 1970-01-01
      相关资源
      最近更新 更多