使用
String#gsub
我可以在替换属性中插入断行:
"my string".gsub(/\s/, "\n") #=> "my\nstring"
但是,如果我还想在替换属性中使用正则表达式匹配的一部分,我将被迫使用单个配额(')。然后我不知道如何插入断线。
我已经尝试过:
> "my string".gsub!(/(my )/, '\1\n')
=> "my \\nstring"
> "my string".gsub!(/(my )/, '\1\\n')
=> "my \\nstring"
> "my string".gsub!(/(my )/, '\1\\\n')
=> "my \\nstring"
> "my string".gsub!(/(my )/, '\1\\\\n')
=> "my \\nstring"
> "my string".gsub!(/(my )/, '\1\\\\\n')
=> "my \\\\nstring"
> "my string".gsub!(/(my )/, '\1\\\\\n')
=> "my \\\\nstring"
没有任何作用。
您不需要使用单引号。只需使用双引号并将
\1
转义为 \\1
:
irb> "my string".gsub(/(my )/, "\\1\n")
=> "my \nstring"
单引号和双引号之间的区别在于,在单引号字符串中,不能使用转义序列(单引号除外)。这些字符串是等效的:
irb> '\1' == "\\1"
=> true
irb> '\n' == "\\n"
=> true
虽然很少使用,但您可以在 Ruby 中混合和匹配具有不同引号样式的字符串文字。
来自文档:
只要百分比字符串不是最后一个,相邻单引号、双引号、百分比字符串的任何组合都将被连接。
适用于您的问题:
"my string".gsub(/(my )/, '\1' "\n")
#=> "my \nstring"
在上面的代码中,
'\1' "\n"
代表一个single字符串实例。您还可以将其粘贴到 IRB 中,它将返回其双引号等效项:
'\1' "\n"
#=> "\\1\n"
您可以在代码中使用它:
"my string".gsub(/(my )/, "\\1\n")
#=> "my \nstring"