【问题标题】:Remove spaces around hyphen in Ruby在 Ruby 中删除连字符周围的空格
【发布时间】:2019-07-23 07:25:22
【问题描述】:

我有下一个字符串:

'foo-bar'

'foo - bar'

'foo -bar'

'foo-bar'

'foo-bar-baz'

'foo - bar -baz'

'foo-bar baz'

等等

在 ruby​​ 中,让连字符周围没有空格的最佳方法是什么? 不带连字符的单词之间应保留空格。

预期结果示例: '富吧' 'foo-bar-baz' 'foo-bar baz'

【问题讨论】:

  • "foo-bar -baz - blerp blorp".gsub(/\s+(?=-)|(?<=-)\s+/, &:strip) #⇒ "foo-bar-baz-blerp blorp".
  • 所有答案都使用str.gsub(/\s*-\s*/, '-') 的一些变体,但假设str = "my - oh-\n my"。然后str.gsub(/\s*-\s*/, '-') #=> "my-oh-my",这是不正确的。如果您想删除连字符周围的空格,请删除空格,而不是空格:str.gsub(/ *- */, '-') #=> "my-oh-\n my".

标签: regex ruby string


【解决方案1】:

快速有效的方法是使用正则表达式:

"foo-bar -baz - blerp blorp".gsub(/\s*-\s*/, "-")
=> "foo-bar-baz-blerp blorp"

\s* 表示“零个或多个空白字符”。请注意,这将匹配制表符和空格。如果只想匹配空格,请改用[ ]*

【讨论】:

  • 为什么是/[ ]*/ 而不是/ */?如果您使用 /x... 可读性,我会理解?
  • 是的,可读性。这是我养成的习惯,因为我经常使用/x 来分隔正则表达式的复杂部分,甚至在有帮助时添加 cmets。 [ ] 感觉更明确和明显,这通常是我的偏好。
【解决方案2】:

使用正则表达式。我相信你的正则表达式应该是这样的:

regex = /\s*-\s*/

test_strings = ["foo-bar baz", "foo - bar baz", "foo -bar"]

test_strings.map do |test_string|
  test_string.gsub(regex, "-")
end
# => ["foo-bar baz", "foo-bar baz", "foo-bar"]

额外提示,这是一个构建正则表达式的好应用:https://rubular.com/

【讨论】:

    【解决方案3】:

    更通用的变体(不重复分隔符):

    "foo-bar -baz - blerp blorp".gsub(/\s*-\s*/) { |part| part.strip }
     => "foo-bar-baz-blerp blorp"
    

    【讨论】:

    • "foo-bar -baz - blerp blorp".gsub(/\s*-\s*/, &:strip)
    【解决方案4】:

    如果您正在寻找没有正则表达式的解决方案,您可以简单地在每个 '-' 处拆分字符串,剥离子字符串并再次加入它们:

    "foo - bar -baz".split('-').map(&:strip).join('-')
    # => "foo-bar-baz"
    

    【讨论】: