【问题标题】:Using Ruby's gsub with a string containing "\0"将 Ruby 的 gsub 与包含 "\0" 的字符串一起使用
【发布时间】:2010-07-27 02:35:16
【问题描述】:

我无法正确使用 gsub:

鉴于此代码:

"replace me".gsub(/replace me/, "this \\0 is a test")

结果是:

 "this replace me is a test" 

但我期待的是:

"this \0 is a test"

如何使用 gsub 来获得我想要的结果?

【问题讨论】:

  • \0 是一个被整个匹配替换的反向引用,它不是 Ruby 独有的。 (您通常将它们视为 \1、\2 等。\0 更为罕见)
  • '\0' 出现在单引号中时(就像gsub 通常的最后一个参数一样),它等效于双引号中的"\\0",因为你不能有任何其他转义序列比'\\''\'' 用单引号括起来。

标签: ruby gsub


【解决方案1】:

用另一个反斜杠转义它,这样gsub 就会知道你想要"\\0"

"replace me".gsub(/replace me/, "this \\\\0 is a test")

(编辑) 如果"\0" 指的是字节0x00,请执行以下操作:

"replace me".gsub(/replace me/, "this \0 is a test")

【讨论】:

  • 不,我不是说“\0”作为字节 0x00
  • 假设我有字符串string = 'this \0 is a test',我想使用这个字符串作为gsub 的第二个参数。 string.gsub(/\\/,'\\\\') 会工作吗?如何转义 string 以便 \0 不会被匹配替换?
  • 如果替换文本不是您在编码时无法转义的字符串文字,那么这将转义它们:string.gsub!(/(\\\d)/,'\\\\\1') - 替换字符串中有五个斜杠。每两个在实际字符串中变成一个,所以gsub 看到\\\1 表示一个反斜杠后跟正则表达式\\\d 的第一个匹配项。这本身就是一个反斜杠,后跟一个数字。因此,假设输入字符串包含 \0,它将被转换为 \\0 或字面上的两个反斜杠,后跟一个数字零。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
  • 1970-01-01
  • 2013-08-14
  • 2023-03-10
  • 1970-01-01
  • 2011-03-29
相关资源
最近更新 更多