首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Ruby中执行不带反斜杠转义的字符串替换

如何在Ruby中执行不带反斜杠转义的字符串替换
EN

Stack Overflow用户
提问于 2019-05-20 15:23:22
回答 3查看 425关注 0票数 3

考虑一下守则:

代码语言:javascript
复制
output = `cat test.txt`
puts output  # /^\\([0-3][0-9]\\/[0-1][0-9]\\/[2-9][0-9]{3}\\)$/
str = 'test ' + output
puts str     # test /^\\([0-3][0-9]\\/[0-1][0-9]\\/[2-9][0-9]{3}\\)$/
new_str = 'new test ' + output
puts new_str # new test /^\\([0-3][0-9]\\/[0-1][0-9]\\/[2-9][0-9]{3}\\)$/

res = str.sub('test', 'new test')
puts res     # new test /^\\([0-3][0-9]\\/[0-1][0-9]\\/[2-9][0-9]{3}\\)$/ <-- all fine
res = str.sub(str, new_str)
puts res     # new test /^\([0-3][0-9]\/[0-1][0-9]\/[2-9][0-9]{3}\)$/     <-- !!! problem

代码只是为了呈现我所遇到的问题;)

问题:我用双反斜杠替换文本,我需要将它写到另一个文件

的问题是:是否有任何简单的替换方法不解释反斜杠(可能是一些二进制模式)?

因为这样做有点奇怪:res = str.sub(str, new_str.gsub('\\', '\\\\\\\\')),虽然这很管用.

真正的工作代码:

代码语言:javascript
复制
file = 'some/random/file.php'
contents = new_contents = ''
File.open(file, 'rb') do |f|
  contents = new_contents = f.read
end

contents.scan(/('([A-Z]+)' \=\> \<\<\<'JSON'(.*?)JSON)/m) do |match|
  Dir.glob("*#{match[1]}.json") do |filename|
    compressed = `../compress.py #{filename}`.gsub('\\', '\\\\\\\\')
    replacement = match[0].sub(match[2], "\n" + compressed).force_encoding('ASCII-8BIT')

    new_contents = new_contents.sub(match[0], replacement.gsub('\\', '\\\\\\\\'))
  end
end

File.open(file, 'wb') do |f|
  f.write(new_contents)
end
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-05-21 00:19:01

最后,我找到了非常简单的解决方案:

代码语言:javascript
复制
input = '{"regex": "/^\\\\([0-3][0-9]\\\\)$/"}'
puts input # gives => {"regex": "/^\\([0-3][0-9]\\)$/"}

search = '/^\\\\([0-3][0-9]\\\\)$/'
replace = '/^\\\\([0-9]\\\\)$/'

puts input.sub(search, replace) # gives => {"regex": "/^\([0-9]\)$/"}, which is wrong result

input[search] = replace # <-- here is the trick, but makes changes in place
puts input # gives => {"regex": "/^\\([0-9]\\)$/"} => success!

但!如果您的字符串不包含任何search子字符串,您将得到一个string not matched (IndexError)

因此,您可能希望像这样防弹代码:

代码语言:javascript
复制
input[search] = replace if input.include? search

此外,如果您想保持input不受影响,可以将其.dup为另一个变量:

代码语言:javascript
复制
new_input = input.dup
new_input[search] = replace if new_input.include? search
票数 4
EN

Stack Overflow用户

发布于 2019-05-20 16:33:39

可以使用范围替换字符串的一部分。所以你只需要找到那个范围

代码语言:javascript
复制
if index = string.index(str_to_replace)
  string[index...(index + str_to_replace.length)] = replacement
end

这个例子是在适当的情况下完成的,如果需要的话,也可以对一个dup执行。

票数 1
EN

Stack Overflow用户

发布于 2019-05-20 21:01:40

不,每个Ruby字符串文本都必须避免反斜杠。Ruby确实允许这样的任意字符串分隔符:

代码语言:javascript
复制
%q{A string}
%Q<A string>
%.A string.

ruby-doc.orgwikibooks.org。然而,这些都将反斜杠视为特殊字符,并要求对其进行转义。

一种选择是把你的替代品放在一个数据文件中(例如。( CSV)并阅读以下替换内容:

代码语言:javascript
复制
while line = data_file.gets
  pattern, replacement = *line.split(separator)
  str.gsub!(Regexp.compile(pattern), replacement)
end

数据文件将而不是需要转义替换中的任何字符。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56223924

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档