代码之家  ›  专栏  ›  技术社区  ›  fguillen

String#gsub如何在replace属性中使用匹配项,并插入换行符[重复]

  •  0
  • fguillen  · 技术社区  · 4 月前

    String#gsub 我可以在replace属性中插入换行符:

    "my string".gsub(/\s/, "\n") #=> "my\nstring"
    

    但是,如果我也要在replace属性中使用正则表达式匹配的一部分,我将被迫使用单个配额(')。然后我不知道如何插入断线。

    我试过:

    > "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"
    

    什么都没用。

    2 回复  |  直到 4 月前
        1
  •  3
  •   Dogbert    4 月前

    你不需要使用单引号。只需使用双引号并转义 \1 \\1 :

    irb> "my string".gsub(/(my )/, "\\1\n")
    => "my \nstring"
    

    单引号和双引号之间的区别在于,在单引号字符串中,不能使用转义序列(单引号除外)。这些字符串是等价的:

    irb> '\1' == "\\1"
    => true
    irb> '\n' == "\\n"
    => true
    
        2
  •  2
  •   Stefan    4 月前

    您可以同时使用多种报价样式。虽然很少使用,但您可以在Ruby中混合和匹配具有不同引号样式的字符串文字。

    docs :

    只要百分比字符串不是最后一个,相邻的单引号、双引号、百分比字符串的任何组合都将被连接起来。

    适用于您的问题:

    "my string".gsub(/(my )/, '\1' "\n")
    #=> "my \nstring"
    

    在上述代码中 '\1' "\n" 代表a 单一的 字符串实例。您还可以将这些组合文字粘贴到IRB中,它将返回其双引号字符串文字等效值:

    '\1' "\n"
    #=> "\\1\n"
    

    这反过来又可以在代码中使用:

    "my string".gsub(/(my )/, "\\1\n")
    #=> "my \nstring"