这是代码:
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中要替换的值时它会将值正确复制到该位置。
我该怎么做?
答案 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"
但是,为什么甚至使用sub
或gsub
等模式或方法?
target = "agggz"
target[0] + str + target[-1] # => "amy \\\\ stringz"