【问题标题】:what is the elegant way to replace string without gsub?没有gsub替换字符串的优雅方法是什么?
【发布时间】:2014-01-14 19:39:08
【问题描述】:

我有一些动态字符串,其中有一个X 字符。 X 可以连续出现,也可以分散在字符串中。我想用#替换那些X

例如,abXXcX12XX。我想要ab#c#12#。这意味着多个连续的X 必须只替换为一个#,如果只有一个X,那么也可以替换为一个#

我试过了:

s = "aXX123Xc56XXX"
s.squeeze('X').gsub('X','#') # => "a#123#c56#"

任何优雅的方式或直接的方法来做同样的操作?

【问题讨论】:

  • 这不是关于优雅的问题,实际上是关于正确性的问题。使用squeeze 的问题在于它会挤压任何类型的字符,而不仅仅是X
  • @DavidGrayson 那是我的错字……我修好了……
  • 因为您没有使用带有gsub 的正则表达式,所以您将失去gsub 所需的特征,它可以让您完全删除squeeze。正如几个答案所示,使用/X+/ 将吞噬连续的'X' 字符,用单个'#' 替换它们。

标签: ruby string replace gsub


【解决方案1】:

我将使用String#tr_s 如下:

按照String#tr 中的说明处理 str 的副本,然后删除受翻译影响的区域中的重复字符。

s = "aXX123Xc56XXX"
s.tr_s('X','#') # => "a#123#c56#"

【讨论】:

  • @theTinMan 它的 tr_s 不是 tr 甚至在 1.9.3 中也可用
  • 当我第一次看到你的回答时,我有@the 的反应。由于不熟悉tr_s,我的大脑锁定了tr,并提出了一个危险信号。只有当我检查文档中的 String#tr 时,我才注意到下面的 tr_s
  • 有趣。当我单击该链接时,Firefox 登陆 tr 并没有滚动到 tr_s。是的,tr_s 很合适,而且效果很好。
【解决方案2】:

不确定为什么不在这里使用 gsub? 正则表达式似乎工作得很好:

"aXX123Xc56XXX".gsub(/X+/, "#")
=> "a#123#c56#"  

这样做的原因是/X+/ 将匹配一个或多个 X 字符,因此连续多个X 将只生成一个匹配项并被一个@ 替换987654325@.

【讨论】:

  • 因为 OP 在标题中排除了gsub。我同意这是处理它的最佳方式。不过,您应该解释为什么这样做效果更好。
  • 是的,我写这个答案的原因是它比OP所说的更简单,更优雅,并且OP没有给出不允许gsub的理由。我同意tr_s 的答案也更好!
【解决方案3】:
 pry(main)> "aXX123Xc56XXX".gsub(/X+/, "#")
=> "a#123#c56#"

【讨论】:

  • OP 说它不能使用gsub。不过,使用gsub(/X+/,... 是正确的方法。不过,您可能想解释一下您的代码;在没有解释的情况下扔掉代码并没有真正的帮助。而是教导为什么这是做某事的方式。
  • @theTinMan OP 正在寻找一种不使用squeezegsub 的更优雅的方式,发布后,有人打我解释同一段代码,那我为什么要需要重申显而易见的
【解决方案4】:

虽然gsubtr_s 都可以完成任务,但使用tr_s 的令人信服的理由如下:

require 'fruity'

STRING = 'aXX123Xc56XXX' * 1000

compare do
  using_tr_s { STRING.tr_s('X', '#') }
  using_gsub { STRING.gsub(/X+/, '#') }
end

在我的笔记本电脑上运行后,结果:

Running each test 16 times. Test will take about 1 second.
using_tr_s is faster than using_gsub by 5x ± 0.1

正则表达式引擎已经看到很多加速,但它仍然会被非锚定查找击败。如果有办法告诉它从字符串的开头或结尾开始,我们会看到它大大加快了速度,并且对于某些搜索/替换操作,我已经看到它超过了其他所有操作。使用的模式很关键;写得不好会削弱引擎,所以要小心你使用的东西。

【讨论】:

    猜你喜欢
    • 2015-10-12
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    相关资源
    最近更新 更多