如何使字符串安全在gsub中使用?

时间:2013-12-12 11:41:10

标签: ruby gsub

这是代码:

pattern = /(a)(.*?)(z)/
 => /(a)(.*?)(z)/ 

# Correct
str = "my // string"
 => "my // string" 
"agggz".gsub(pattern, '\1' + str + '\3')
 => "amy // stringz" 

# Wrong - there is one missing slash
str = "my \\\\ string"
 => "my \\\\ string" 
"agggz".gsub(pattern, '\1' + str + '\3')
 => "amy \\ stringz" 

当我在字符串中描述模式时,我可以使用Regexp.escape来确保模式能够按预期工作。

我正在寻找的是类似的东西,但对于gsub的第二个参数,即独立于str,当用作{{1中要替换的值时它会将值正确复制到该位置。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

从:

开始
pattern = /(a)(.*?)(z)/                   # => /(a)(.*?)(z)/
str = "my \\\\ string"                    # => "my \\\\ string"

而不是:

"agggz".gsub(pattern, '\1' + str + '\3')  # => "amy \\ stringz"

我会这样做:

"agggz"[pattern] # => "agggz"
$1 + str + $3 # => "amy \\\\ stringz"

大多数时候我们真的想要匹配一个字符串来提取东西,偶尔我们想要一个字符串来将它转换成其他东西。在这种情况下,你想要提取东西,所以这样做;获取检索到的值并通过连接制作您真正想要的内容。

但是有很多问题和例子没有意义。如果您知道该字符串以a开头,并以z结尾,那么请不要使用正则表达式或gsub(或sub):

'a' + str + 'z' # => "amy \\\\ stringz"

如果您不知道第一个和最后一个字母是什么,那么为什么要搜索(a)(z)?您的模式应使用通配符:/^(.).*?(.)$/

pattern = /^(.).*(.)$/
"agggz"[pattern]

$1 + str + $2  # => "amy \\\\ stringz"

但是,为什么甚至使用subgsub等模式或方法?

target = "agggz"
target[0] + str + target[-1] # => "amy \\\\ stringz"