从Ruby中的文本体中提取值
我需要从多行字符串中提取一些值(我从电子邮件的文本体中读取)。我希望能够向解析器提供模式,以便以后可以自定义不同的电子邮件。我得出了以下结论:从Ruby中的文本体中提取值,ruby,regex,text,extract,extraction,Ruby,Regex,Text,Extract,Extraction,我需要从多行字符串中提取一些值(我从电子邮件的文本体中读取)。我希望能够向解析器提供模式,以便以后可以自定义不同的电子邮件。我得出了以下结论: #!/usr/bin/env ruby text1 = <<-eos Lorem ipsum dolor sit amet, Name: Pepe Manuel Periquita Email: pepe@manuel.net Sisters: 1 Brothers: 3 Children: 2 Lorem ipsum dolo
#!/usr/bin/env ruby
text1 =
<<-eos
Lorem ipsum dolor sit amet,
Name: Pepe Manuel Periquita
Email: pepe@manuel.net
Sisters: 1
Brothers: 3
Children: 2
Lorem ipsum dolor sit amet
eos
pattern1 = {
:exp => /Name:[\s]*(.*?)$\s*
Email:[\s]*(.*?)$\s*
Sisters:[\s]*(.*?)$\s*
Brothers:[\s]*(.*?)$\s*
Children:[\s]*(.*?)$/mx,
:blk => lambda do |m|
m.flatten!
{:name => m[0],
:email => m[1],
:total => m.drop(2).inject(0){|sum,item| sum + item.to_i}}
end
}
# Scan on text returns
#[["Pepe Manuel Periquita", "pepe@manuel.net", "1", "3", "2"]]
def do_parse text, pattern
data = pattern[:blk].call(text.scan(pattern[:exp]))
puts data.inspect
end
do_parse text1, pattern1
# ./text_parser.rb
# {:email=>"pepe@manuel.net", :total=>6, :name=>"Pepe Manuel Periquita"}
也许像这样的东西足够通用
pp Hash[*text1.scan(/^(.+?):\s(.+)$/).map{|x|
[x[0].downcase.to_sym, x[1]]
}.flatten]
=>
{:sisters=>"1",
:brothers=>"3",
:children=>"2",
:name=>"Pepe Manuel Periquita",
:email=>"pepe@manuel.net"}
这很好,但是如何对匹配的值应用表达式来派生其他值,例如我的示例中的total,它是三个字段的总和?
pp Hash[*text1.scan(/^(.+?):\s(.+)$/).map{|x|
[x[0].downcase.to_sym, x[1]]
}.flatten]
=>
{:sisters=>"1",
:brothers=>"3",
:children=>"2",
:name=>"Pepe Manuel Periquita",
:email=>"pepe@manuel.net"}