我正在尝试在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,我无法弄明白。
提前感谢大家。
答案 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 -->
;当他们真的要你的时候,不要因为有点偏执而受伤。
参考文献:
File.read
(实际上IO.read
)String#match
String#strip
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