2013-03-28 29 views
0

我正在寻找gsub的版本,它不会尝试将其输入解释为正则表达式,并使用普通的类似C的转义字符串。Ruby中gsub的非正则表达式版本

更新

这个问题由一个奇怪的行为发起:

text.gsub("pattern", "\\\\\\") 

text.gsub("pattern", "\\\\\\\\") 

被视为相同,

text.gsub("pattern", "\\\\") 

被视为单个反斜杠。

回答

3

有转义GSUB的第二参数的两个层:

第一层是红宝石串不变。如果它是这样写\\\\\\它是由红宝石转义像\\\

所述第二层GSUB本身:\\\被处理像\\ + \

双反斜线被分解为单个:\\ =>\和单尾随最后的反斜杠被解析为自身。

8反斜线分析在类似的方式:

"\\\\\\\\" => "\\\\" 

然后

"\\\\" => "\\" 

所以由六个和八个反斜杠常量分解为两个反斜杠。

为了让生活更轻松一点,可以在gsub函数中使用块。块中的字符串常量只能通过Ruby层传递(感谢@Sorrow)。

"foo\\bar".gsub("\\") {"\\\\"} 
2

gsub接受字符串作为第一个参数:

the pattern is typically a Regexp; if given as 
a String, any regular expression metacharacters 
it contains will be interpreted literally 

实施例:

"hello world, i am thy code".gsub("o", "-foo-") 
=> "hell-foo- w-foo-rld, i am thy c-foo-de" 
+0

那么为什么要替换为两个反斜杠\\我必须写六个反斜杠? “\\\\\\”见这里:http://stackoverflow.com/questions/1542214/weird-backslash-substitution-in-ruby – Paul

+0

不太确定你的意思是......“”foo \\\\ bar “.gsub(”\\\\“,” - “)'产生''foo-bar”'(也是''foo \\\\ bar“.count('\\')== 2')只要你用字符串操作,就是......如果你用相反的方式来做(用两个\ s替换它) - 答案就在你链接的线程中(可怕的细节;);出于这个原因(和其他清晰的原因),我会建议你使用'gsub'的块语法而不是两个参数 – Sorrow

+0

试着用一个反斜杠代替双反斜杠,你会看到。 – Paul