正则表达式提取三个单独的值

时间:2012-10-27 02:37:40

标签: ruby-on-rails ruby regex text

我从XML中的RSS源中获取了一些信息。我需要一些帮助才能获得我需要的值。

我希望正则表达式可以相当宽松,以防标签,换行符或空格发生变化,但是,我对正则表达式非常恐怖,所以我需要一些帮助。

这是我的文字:

\n\t\t\t\t\tMIDDAY DRAW DATE: \t\t\tFriday 10/26/12 \n\t\t\t\t\tMIDDAY WINNING NUMBER:\t\t\t6-9-6-0\n\t\t\t\t\tMIDDAY PAYOUT: \t$4,000.\n\t\t\t\t\tNEXT MIDDAY DRAW DATE: \tSaturday 10/27/12\n\t\t\t\t

此外,这些\n\t个字符都只是纯文本。

我想将每个值提取到单独的变量中,所以:

MIDDAY DRAW DATE
MIDDAY WINNING NUMBER
MIDDAY PAYOUT
NEXT MIDDAY DRAW DATE

如果有人可以提供帮助,那就太好了。

6 个答案:

答案 0 :(得分:4)

string.scan(/^\s*(.*?):\s*(.*?)\s*$/)

会给你:

[
  ["MIDDAY DRAW DATE", "Friday 10/26/12"],
  ["MIDDAY WINNING NUMBER", "6-9-6-0"],
  ["MIDDAY PAYOUT", "$4,000."],
  ["NEXT MIDDAY DRAW DATE", "Saturday 10/27/12"]
]

如果您只想要没有键的值,那么

string.scan(/:\s*(.*?)\s*$/)

会给你:

[
  ["Friday 10/26/12"],
  ["6-9-6-0"],
  ["$4,000."],
  ["Saturday 10/27/12"]
]

答案 1 :(得分:1)

以下内容应该有效:

^\s*MIDDAY DRAW DATE:\s*(.*?)\s*MIDDAY WINNING NUMBER:\s*(.*?)\s*MIDDAY PAYOUT:\s*(.*?)\s*NEXT MIDDAY DRAW DATE:\s*(.*?)\s*$

示例:http://www.rubular.com/r/qrxMyc7tT7

您感兴趣的每个值都将位于捕获的组中。

答案 2 :(得分:0)

我不太明白你是什么意思,是不是" MIDDAY DRAW DATE" =" Friday 10/26/12"?跟着应该工作。

(\\n|\\t)*([\w\s]+(?:\s)?)(\\n|\\t)*([\w\s]+)

答案 3 :(得分:0)

Hash[*string.split(/\s{2,}/)[1..-1]]
#=> {"MIDDAY DRAW DATE:"=>"Friday 10/26/12", "MIDDAY WINNING NUMBER:"=>"6-9-6-0", "MIDDAY PAYOUT:"=>"$4,000.", "NEXT MIDDAY DRAW DATE:"=>"Saturday 10/27/12"}

答案 4 :(得分:0)

如果您不需要单行,听起来您可以在/\n\t*/上拆分字符串以获取每个名称/值对,然后将每个结果拆分为: \t+或{{ 1}}将名称与值分开并修剪空格。在JS中,它将类似于:

:\s*

编辑:如果您只想要按键,则更容易:

//JS version 1.8.1 or higher
var result = input.trim()
                .split(/\s*\n\t*/)
                .map(function(el) { return el.split(/:\s*/); });

//test:
result.reduce(function(i, j) { return i + ',\n' + j;});

答案 5 :(得分:0)

我会用:

require 'pp'

text = "\n\t\t\t\t\tMIDDAY DRAW DATE: \t\t\tFriday 10/26/12 \n\t\t\t\t\tMIDDAY WINNING NUMBER:\t\t\t6-9-6-0\n\t\t\t\t\tMIDDAY PAYOUT: \t$4,000.\n\t\t\t\t\tNEXT MIDDAY DRAW DATE: \tSaturday 10/27/12\n\t\t\t\t"
pp text.strip.split("\n").map{ |l| l.split(':').map(&:strip) }

导致:

[["MIDDAY DRAW DATE", "Friday 10/26/12"],
["MIDDAY WINNING NUMBER", "6-9-6-0"],
["MIDDAY PAYOUT", "$4,000."],
["NEXT MIDDAY DRAW DATE", "Saturday 10/27/12"]]

基本上所有需要做的就是清理一些字符串,然后在新行上拆分,然后在':'上拆分,再清除一些字符串。不需要正则表达式。