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

ruby在两个字符串之间打印选定的文本行,ruby,regex,Ruby,Regex,我试图在ruby中获取两个字符串之间的一组文本,但似乎无法获得正确的方法或使用正确的正则表达式 正文: 各种html 废话 我一直在做这个 我只想获取从到的所有内容,并将该文本块保存在一个文本文件中 我一开始就想出了打印这行的方法: File.open(“index.html”)。每行 body.each{| line |在line=~/的情况下放置line printing = false File.open("index.html").each_line do |line| prin

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

正文:


各种html
废话

我一直在做这个

我只想获取从
的所有内容,并将该文本块保存在一个文本文件中

我一开始就想出了打印这行的方法:

File.open(“index.html”)。每行
body.each{| line |在line=~/的情况下放置line

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
printing=false
打开(“index.html”)。每行|

printing=true如果line=~/不要一行一行地打印,只需将整个内容拖成一个字符串并将其撕开:

s    = File.read('index.html')
want = s.match(/<!-- begin posts -->(.*)<!-- end posts -->/m)[1]
正如都铎在下面所指出的,如果你认为有可能出现多个
标记,那么你可能希望在小组中使用一个非贪婪的
(.*)
;当他们真的是你想要得到你的时候,不要有点偏执

参考资料:

  • (实际上是
    IO.read
更新:字符串上的方法返回一个对象

mtch[0]
相当于特殊变量
$&
,并返回整个匹配字符串。
mtch[1]
mtch[2]
,依此类推,返回匹配的反向引用的值(括号之间的模式部分)

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

File.readlines(ARGV[0])。每个do |行|
File.readlines(ARGV[0]).each do|line|
  if line =~ /<!-- begin posts -->/ .. line =~ /<!-- end posts -->/     
    puts line
  end
end
如果line=~/..line=~// 放线 结束 结束
FYI,对于您的用例来说,一个更好的选择可能是使用ERB,请参见以下答案中的示例:这看起来真的很棒。我将尝试探索一下。谢谢。@mu_是我实际上有相同的代码,但结尾没有[1]。您能解释一下吗?@rick:我补充说(另一个)更新一些关于
match
返回的内容以及
[1]
的用途的注释。@mu_谢谢!有没有一种简单的方法将字符串包含在正则表达式中,以便将它们包含在“#{want}”中?@rick:整个过程将在
[0]
中:“…
mtch[0]
相当于特殊变量
$&
,并返回整个匹配字符串。”@mu-您可能希望使用
*?
而不是
*
,因为在同一页面中有多个
标记,这给了我
语法错误,意外的$end,期望kEND
您可以在这里使用触发器运算符。然后,再次使用触发器,以便下一个阅读它的人可能会感到困惑。
want = s.match(/<!-- begin posts -->(.*)<!-- end posts -->/m)[1].strip
File.readlines(ARGV[0]).each do|line|
  if line =~ /<!-- begin posts -->/ .. line =~ /<!-- end posts -->/     
    puts line
  end
end