ruby 在文件中检索是否有指定内容(match带反斜杠的string)
ruby吧
全部回复
仅看楼主
level 1
现需要实现以下功能:在D:\tpbase-contps\src\tests\tplib\test.txt 文件中检索D:\tpbase-contps\a 字符串,
我写的脚本如下:
file_name="D:\\tpbase-contps\\src\\tests\\tplib\\test.txt"
str="D:\\tpbase-contps\\a"
File.open(file_name, 'r') do |file|
until (line = file.gets).nil?
next if line.match(str).nil?
p "ok"
break
end
end
运行结果没有输出ok,我也尝试了str='d:\\...' 等各种方法还是不能解决,求教。
2016年04月06日 10点04分 1
level 1
2016年04月06日 10点04分 3
level 5
尴尬了。。我才看ruby几个小时。。正则表达式又不会。。
不过我研究了一下,应该是这样:
str="D:\\\\tpbase-contps\\\\a"
正则表达式中\\\\ 代表一个\
挺有意思,我去学学正则。。[乖]
2016年04月06日 12点04分 4
ruby中\\是\,要传进去\\,就得传\\\\[汗]
2016年04月06日 12点04分
2016年04月06日 14点04分
level 8
next if line.match(str).nil?
改为
next if line.match(Regexp.escape(str)).nil?
Regexp.escape方法会对字符串做正则转义
2016年04月06日 14点04分 6
感谢!明天回公司试试
2016年04月06日 14点04分
果然可以。但我用楼上兄弟的方法做的时候碰到了另一个问题,能否请教一下? 我想替换str里的 \ 为 \\ ,该怎么办
2016年04月07日 03点04分
level 12
不曉得為什麼常看到喜歡用 File.open 的寫法?
foreach 或 readlines 的方法較簡潔,參考一下:
$ cat tmpfile
Elit perferendis provident laborum beatae.
Lorem suscipit laborum hic esse.
Elit impedit perferendis quis assumenda.
$ irb
>> File.foreach("tmpfile").grep(/Elit/).map(&:chomp)
=> ["Elit perferendis provident laborum beatae.", "Elit impedit perferendis quis assumenda."]
>> File.foreach("tmpfile") do |line|
?> puts 'ok' if line =~ /Elit/
>> end
ok
ok
=> nil
2016年04月07日 00点04分 7
刚开始学,以后知道了
2016年04月07日 07点04分
level 8
这个图应该比较清楚了,总之你只要保证正则字符串里是有两个\就行,然后用escape转义。
这里牵扯到单引号和双引号的一点区别,单引号中\字符后如果再跟一个\也就是\\,会自动转义为一个\,若跟的是其他字符则不会转义。例如上图中第四行的'\\\tpbase'实际上解析的时候是\\→\(转义)然后\tpbase→\tpbase(不转义),因此最后产生的是字符串\\tpbase。
2016年04月07日 04点04分 9
了解了
2016年04月07日 07点04分
1