Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么String#gsub的内容会加倍?_Ruby On Rails_Ruby_Regex_Gsub - Fatal编程技术网

Ruby on rails 为什么String#gsub的内容会加倍?

Ruby on rails 为什么String#gsub的内容会加倍?,ruby-on-rails,ruby,regex,gsub,Ruby On Rails,Ruby,Regex,Gsub,这似乎是错误的,我希望得到“#main=\\\'quotes\\'” 当我不使用escape char时,它就会按预期工作 s = "#main= 'quotes' s.gsub "'", "\\'" # => "#main= quotes'quotes" 所以这一定与逃跑有关 使用ruby 1.9.2p290 我需要用反斜杠和引号替换单引号 甚至更多的矛盾: s.gsub "'", "*" # => "#main= *quotes*" 这是怎么回事 "\\'".length #

这似乎是错误的,我希望得到
“#main=\\\'quotes\\'”

当我不使用escape char时,它就会按预期工作

s = "#main= 'quotes'
s.gsub "'", "\\'" # => "#main= quotes'quotes"
所以这一定与逃跑有关

使用ruby 1.9.2p290

我需要用反斜杠和引号替换单引号

甚至更多的矛盾:

s.gsub "'", "*" # => "#main= *quotes*"
这是怎么回事

"\\'".length # => 2
"\\*".length # => 2

# As expected
"'".gsub("'", "\\*").length # => 2
"'a'".gsub("'", "\\*") # => "\\*a\\*" (length==5)

# WTF next:
"'".gsub("'", "\\'").length # => 0

# Doubling the content?
"'a'".gsub("'", "\\'") # => "a'a" (length==3)

由于
\
它是
\
等效的,如果你想得到一个双反斜杠,你必须放四个一。

你还需要逃出\的限制:

s = "#main = 'quotes'

s.gsub "'", "\\\\'"
输出

s.gsub "'", "\\\\'"
在外部论坛上可以找到一个很好的解释:

理解IMHO的关键是反斜杠在 替换字符串。所以,无论何时,只要你想要一个文字 替换字符串中的反斜杠需要转义,因此 有[两]个反斜杠。巧合的是,反斜杠在图形中也很特殊 字符串(即使在单个带引号的字符串中)。所以你需要两个层次的 转义,在屏幕上为一个文本做2*2=4个反斜杠 替换反斜杠


你会被以下的特殊性绊倒:

\0
\1
\2
<代码>\9,
\&
\`
\'
\+

替换第n个分组子表达式匹配的值,或替换整个匹配、匹配前或匹配后或最高组匹配的值

所以当你说
“\\'”
时,双引号
\
变成了一个反斜杠,结果是
\'
,但这意味着“最后一次成功匹配的右边的字符串”。如果你想用转义单引号替换单引号,你需要转义更多,以克服
\
的特殊性:

"#main= \\'quotes\\'"
或避免使用牙签,并使用块状:

s.gsub("'", "\\\\'")
如果您试图避开反勾号、加号,甚至是一个数字,您也会遇到类似的问题


这里的整体经验是,除了最简单的替换之外,更喜欢使用字符串。

但是它已经被转义了-字符串
“\\”
应该返回一个斜杠。因此,
“\\'”
返回长度等于2的字符串:第一个是斜杠,第二个是引号。在gsub中它是混乱的,因为它将内容加倍(为什么?)。此外,
.gsub(“'”,“\\*”)
按预期工作,这甚至更加不一致。问题是在正则表达式替换中,这一有点模糊的功能主要是出于历史原因。我不想要双反斜杠-只有一个。这就是为什么我避开一个斜杠并加上引号。
“\\\”。长度==2
,这是正确的
gsub
通过将内容翻倍而出错。非常感谢。它肯定会把事情弄清楚。我只是想知道替换是什么意思?我记不起来我在任何地方都见过它们。@Dmytrii:查看它们的全局变量版本可能会有所帮助()。我不知道有什么好的权威在线参考Ruby的正则表达式。我必须把[ruby][gsub]标签组合起来,然后再看看“FAQ”标签。@安德鲁:谢谢图书管理员的工作。
s.gsub("'") { |m| '\\' + m }