ruby在2个字符串之间打印选定的文本行

时间:2011-07-09 04:45:16

标签: ruby regex

我正在尝试在ruby中的两个字符串之间获取一组文本,我似乎无法获得正确的方法或使用正确的正则表达式。

文本:

<html>
<body>

<!-- begin posts --> 

<h1>all kinds of html<h1>
<p> blah blah </p>
<p> i've been working on this forever </p>

<!-- end posts --> 

</html>
</body>

我只想获得从<!-- begin posts --><!-- end posts -->的所有内容,包括在内,并将该文本块保存在文本文件中。

我想出了如何在开头打印这条线:

File.open("index.html").each_line do |line|
body.each {|line| puts line if line =~ /<!-- begin/}

但不是后面的行和直到最后一个字符串。

我在这里有一个rubular http://rubular.com/r/0W9QDpMGkM,我无法弄明白。

提前感谢大家。

3 个答案:

答案 0 :(得分:8)

不要一行一行地做,只是将整个东西啜饮成一个字符串并撕开它:

s    = File.read('index.html')
want = s.match(/<!-- begin posts -->(.*)<!-- end posts -->/m)[1]

现在,您的标记之间的所有内容都在want中。不要忘记正则表达式上的m修饰符。

当您修改输入时,您也可以删除杂散的前导和尾随空格:

want = s.match(/<!-- begin posts -->(.*)<!-- end posts -->/m)[1].strip

正如都铎在下面所说,如果您认为有多个(.*?)标记的可能性,您可能希望对该组使用非贪婪的<!-- end posts -->;当他们真的要你的时候,不要因为有点偏执而受伤。

参考文献:

UPDATE :字符串上的match方法返回MatchData个对象。 array access operator

  

... mtch[0]等同于特殊变量$&,并返回整个匹配的字符串。 mtch[1]mtch[2]等返回匹配的反向引用的值(括号中的模式部分)。

用于访问匹配的部分。正则表达式中只有一个组,因此[1]可以获取该组的内容而不包含周围的HTML注释分隔符。

答案 1 :(得分:2)

尝试:

printing = false
File.open("index.html").each_line do |line|
  printing = true if line =~ /<!-- begin/      
  puts line if printing
  printing = false if line =~ /<!-- end posts/
end

答案 2 :(得分:0)

File.readlines(ARGV[0]).each do|line|
  if line =~ /<!-- begin posts -->/ .. line =~ /<!-- end posts -->/     
    puts line
  end
end