【问题标题】:Ruby gsub not replacing newline characterRuby gsub 不替换换行符
【发布时间】:2015-07-02 20:41:17
【问题描述】:

我有这个代码

str = @universal_claim_form.errors.full_messages.join
        str.gsub('Patient Contact Information: Value', 'Patient phone number') if str =~ /Patient Contact Information/
        debugger
        str.gsub("\\n", "<br/>")
        debugger
        flash.now[:error] = "Form has errors and was unable to be submitted.<br/> " << str

第一个 gsub 替换不需要的消息,第二个 gsub 用于用 html 换行符替换所有换行符

在调试器的第一行str = "PMP Validation failed. This happens when something you entered does not pass PMP specific validations.\\nPatient phone number: Value must be a 10 digit number"

在第二个调试器中该行没有改变

更奇怪的是,我在命令行的 irb 中执行了此操作,并且成功了

2.1.1 :001 > s = 'test'
 => "test"
2.1.1 :002 > s
 => "test"
2.1.1 :003 > s += '\ntest'
 => "test\\ntest"
2.1.1 :004 > s.gsub('\\n', '<br/>')
 => "test<br/>test"
2.1.1 :005 >

【问题讨论】:

  • gsub 是非变异的,这意味着它只会返回 str 的副本,其中的字符被替换掉(如果你在 irb 中再次调用 s,你会看到这一点,新行是再次回来)。您可以使用变异版本gsub!,它应该可以工作。同样使用gsub,我发现特殊字符在正则表达式中更具可读性,例如str.gsub!(/\n/,'&lt;br/&gt;')。最后请注意,如果没有替换,gsub! 将返回 nilstr 将保持不变。

标签: ruby-on-rails ruby ruby-on-rails-3 replace gsub


【解决方案1】:

您可以调用gsub! 来改变您调用它的字符串(而不是返回一个新字符串)。

irb 中 gsub "works" 的原因是因为它正在输出结果 - irb 不进行任何赋值或突变(超出输入的内容),例如

irb(main):001:0> foo = 4
=> 4
irb(main):002:0> foo + 6
=> 10

foo 被分配了4,因此它输出了该分配的结果,同样foo + 6 它输出了结果,但foo 的值没有改变。

当您调用 gsub 时,它会返回一个带有替换的 new 字符串,这就是您觉得它在 irb 中“有效”的原因(这与打印“4”没有什么不同)多于)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    相关资源
    最近更新 更多