【问题标题】:Ruby : unable to find strings with special character in a fileRuby:无法在文件中找到带有特殊字符的字符串
【发布时间】:2017-05-12 09:41:32
【问题描述】:

我正在尝试使用以下选项检查文件中是否存在字符串:(在 IRB 中尝试过)

File.readlines("E:/nano/ABC.txt").grep(/Digital/).any?
=> true

给了我真实的信息,所以字符串是可用的,但如果我检查下面的 id

File.readlines("E:/nano/ABC.txt").grep(/ncr\abc_efg_dev/).any?
=> false

或

File.readlines("E:/nano/ABC.txt").grep(/ncr\yui30n/).any?
=> false

它给出了false,即使它存在于文件中,它也无法识别该字符串。我不确定如何检查字符串是否存在 - 'ncr\jx8go5' 或 'ncr\atxe5t'

ABC.txt

# Digital created on July 2016
# Digital Owner: John Cena (jxcgo)
# Digital access: create delete access

[groups]
first = ncr\abc_efg_dev, ncr\abc_efg_test, ncr\jx8go5, ncr\atxe5t
digital_owner = ncr\yui30n, ncr\bhyrl4

【问题讨论】:

  • 要从字面上匹配反斜杠,您必须对其进行转义。

标签: ruby regex escaping


【解决方案1】:

您需要转义反斜杠。例如:

File.readlines("E:/nano/ABC.txt").grep(/ncr\\abc_efg_dev/).any?

或者对于一个完全通用的解决方案,您可以使用Regexp#escape:

search_string = 'ncr\abc_efg_dev'
File
  .readlines("E:/nano/ABC.txt")
  .grep(Regexp.new(Regexp.escape(search_string)))
  .any?

这是因为,例如,\a 是一个称为 Bell code 的特殊字符。

其他示例包括\n(换行符)、\t(制表符)、\f(换页)、\v(垂直制表符)、\r(回车)、\s(任何空白字符),\b(退格或单词边界,取决于上下文),...

长话短说,您应该始终在正则表达式(或任何 ruby​​ 中的双引号字符串!)中转义 \,除非您有意使用它来表示特殊字符。

【讨论】:

  • 谢谢,如果是变量替换的场景如何逃生。 (在循环内)例如,我正在从不同的文件中逐一读取字符串值,并检查该字符串是否存在于文件夹内的任何文件中。 values.txt ncr\yui30n ncr\bhyrl4 ncr\abc_efg_dev 检查 - ncr\yui30n 存在于 foreach 循环内目录中的任何文件中,然后检查 ncr\bhyrl4 是否存在于任何文件中。等等..
  • 对于一个完全通用的解决方案,您可以使用Regexp#escape:Regexp.new(Regexp.escape('ncr\yui30n'))。但是,这确实有点笨拙......如果您总是只搜索文字字符串(即您根本不需要使用正则表达式),您也可以考虑using String#include?。
  • 非常感谢。我无法在循环中一一替换多个文件中的给定字符串。抱歉,我知道在这里问是不道德的,但我不确定为什么下面要修改目标文件是我的代码value=File.open('E:\nano\out.txt').read value.each_line do |line| line.chomp! Dir.glob("E:\nano\*.txt") do |file_name| text = File.read(file_name) replace = text.gsub(Regexp.escape("#{line}"), "") File.open(file_name, "w") { |file| file.puts replace } end end
  • 我已修复,文件夹名称不正确。谢谢你的时间:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
相关资源
最近更新 更多