在一個文件裏有不少如下內容: html
<p style="display:none">此題選D。 .... .... .... </p>
而本人要實現的功能是將它替換成: 正則表達式
<div style="display:none" class="sl_explain">此題選D。 ..... ..... ..... </div>這個東西看起來有點簡單,但本人整整花了半天才實現此功能,主要是好久沒寫RUBY程序了,因此對API比較陌生;其次是本人對正則表達式,尤爲是ruby的正則表達式不太熟悉;最後,還由於一些細節考慮得不夠。
要實現上述功能,能夠分爲兩步,第一步是將 ruby
<p style="display:none">此題選D。 .... .... .... </p>中的\n替換掉,即替換成:
<p style="display:none">此題選D。............</p>這種形式,爲何要替換換\n呢,由於在讀文件是,須要一行一行讀,因此有\n的話,這一行就讀不完,那麼在用正則表達式匹配時,天然會匹配不全。要實現替換掉並且只替換掉
<p style="display:none">此題選D。............</p>內部的\n,須要一些限制,具體實現代碼以下:
File.open("邏輯填空2.htm","w") do |test| File.open("邏輯填空.htm",'r:gbk') do |file| file.each_line do | line| if(line.start_with?('<p style="display:none">') && !line.end_with?("</p>\n")) line.gsub!(Regexp.new('\n'), '') end test.print line end end end
即將替換掉的內容放在新的一個文件「邏輯填空2.html」中(注意1,上面輸出到文件時,使用的是print,而不是puts,否則它又會天然加上一個\n,那就白替換了;注意2,上面的end_with後面還加個\n,由於讀取這行結尾時,還有個隱形的換行符\n;注意3,有時候<p style="display:none">前面會有空格,因此能夠將start_with改爲include?),而後再讀取此文件,再經過正則表達式進行替換,將替換掉的內容又放在「test.html」中: spa
File.open("test.html","w") do |test| File.open("邏輯填空2.htm",'r') do |file| file.each_line do | line| line.gsub!(Regexp.new('<p style="display:none">(.*)</p>'), '<div style="display:none" class="sl_explain">\1</div>') test.puts line end end end這樣,本人要實現的功能就達到了,另外,若是若是文件不是一行一行讀取的,卻是能夠用多行匹配的方式來作:
Regexp.new('<p style="display:none">(.*)</p>',Regexp::MULTILINE)惋惜,本人只想出了逐行讀取的方法,因此多行匹配模式沒用上。