Ruby:在文件中找不到具有特殊字符的字符串

Ruby:在文件中找不到具有特殊字符的字符串,ruby,regex,escaping,Ruby,Regex,Escaping,我尝试使用以下选项检查文件中是否存在字符串:(在IRB中尝试) 为true,所以字符串可用,但如果我检查如下ID File.readlines("E:/nano/ABC.txt").grep(/ncr\abc_efg_dev/).any? => false 或 它给出了false,并且它无法识别该字符串,即使该字符串存在于文件中。我不确定如何检查字符串的存在-'ncr\jx8go5'或'ncr\atxe5t' ABC.txt # Digital created on July 2016

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

为true,所以字符串可用,但如果我检查如下ID

File.readlines("E:/nano/ABC.txt").grep(/ncr\abc_efg_dev/).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

你需要避开反斜杠。例如:

File.readlines("E:/nano/ABC.txt").grep(/ncr\\abc_efg_dev/).any?
或者,对于完全通用的解决方案,您可以使用:

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

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


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

要从字面上匹配反斜杠,您必须转义它。谢谢,如果是变量替换场景,如何转义。(在循环中)例如,我从不同的文件中逐个读取字符串值,并检查该字符串是否存在于文件夹中的任何文件中。values.txt
ncr\yui30n ncr\bhyrl4 ncr\abc\u efg\u dev
check-ncr\yui30n出现在foreach循环内目录中的任何文件中,然后检查ncr\bhyrl4出现在任何文件中。以此类推。对于完全通用的解决方案,可以使用:
Regexp.new(Regexp.escape('ncr\yui30n'))
。然而,这是公认的有点笨重。。。如果你总是只搜索字串(也就是说,你根本不需要使用正则表达式),你也可以考虑。非常感谢。我无法在循环中逐个替换多个文件中的给定字符串。抱歉,我知道在这里提问是不道德的,但我不确定为什么要修改下面的目标文件是我的代码
value=File.open('E:\nano\out.txt')。读取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
我修复了它,有一些不正确的文件夹名称。谢谢你抽出时间:)
# 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
File.readlines("E:/nano/ABC.txt").grep(/ncr\\abc_efg_dev/).any?
search_string = 'ncr\abc_efg_dev'
File
  .readlines("E:/nano/ABC.txt")
  .grep(Regexp.new(Regexp.escape(search_string)))
  .any?