如何在" ="之后提取整数使用红宝石的标志

时间:2015-10-29 11:39:32

标签: ruby-on-rails ruby

我试图在mrp=talktime=之后提取整数。

var i=0;
var recharge=[];
var recharge_text=[];
var recharge_String="";
var mrp="";
var talktime="";
var validity="";
var mode="";mrp='1100';
talktime='1200.00';
validity='NA';
mode='E-Recharge';
if(typeof String.prototype.trim !== 'function') {
 String.prototype.trim = function() {
 return this.replace(/^ +| +$/g, '');
 }
}
mrp=mrp.trim();
if(isNaN(mrp))
{
recharge_text.push({MRP:mrp, Talktime:talktime, Validity:validity ,Mode:mode});
}
else
{
mrp=parseInt(mrp);
recharge.push({MRP:mrp, Talktime:talktime, Validity:validity ,Mode:mode});
}
mrp='2200';
talktime='2400.00';

我从网页上提取了上述文字,但我不知道如何单独提取该特定部分。

2 个答案:

答案 0 :(得分:1)

您可以使用正则表达式来解析字符串并提取部分字符串:

my_text = "blablabla" #just imagine that this is your text
regex_mrp = /mrp='(.+?)';/ #extracts whatever is between single quotes after mrp
regex_talktime = /talktime='(.+?)';/ #extracts whatever is between single quotes after talktime

mrp = my_text.match(regex_mrp)[1].to_i #gets the match, and converts to integer
talktime = my_text.match(regex_talktime)[1].to_f #gets the match, and converts to float

以下是正则表达式语法的快速参考:https://msdn.microsoft.com/en-us/library/az24scfc(v=vs.110).aspx

答案 1 :(得分:0)

我做这样的事情:

string = <<EOT
var i=0;
var recharge=[];
var recharge_text=[];
var recharge_String="";
var mrp="";
var talktime="";
var validity="";
var mode="";mrp='1100';
talktime='1200.00';
validity='NA';
mode='E-Recharge';
if(typeof String.prototype.trim !== 'function') {
String.prototype.trim = function() {
return this.replace(/^ +| +$/g, '');
}
}
mrp=mrp.trim();
if(isNaN(mrp))
{
recharge_text.push({MRP:mrp, Talktime:talktime, Validity:validity ,Mode:mode});
}
else
{
mrp=parseInt(mrp);
recharge.push({MRP:mrp, Talktime:talktime, Validity:validity ,Mode:mode});
}
mrp='2200';
talktime='2400.00';
EOT

hits = string.scan(/(?:mrp|talktime)='[\d.]+'/)
# => ["mrp='1100'", "talktime='1200.00'", "mrp='2200'", "talktime='2400.00'"]

这为我们提供了一系列使用scan的匹配,其中模式/(?:mrp|talktime)='[\d.]+'/在字符串中匹配。弄清楚模式是如何工作的,留给用户练习,但Ruby的Regexp文档解释了这一切。

清理那些更有用的东西:

hash = hits.map{ |s|
  str, val = s.split('=')
  [str, val.delete("'")]
}.each_with_object(Hash.new { |h, k| h[k] = [] }){ |(str, val), h| h[str] << val }

您还需要了解each_with_object以及Hash.new发生的事情,因为这些是在Ruby中学习的重要概念。

此时,hash是数组的哈希:

hash # => {"mrp"=>["1100", "2200"], "talktime"=>["1200.00", "2400.00"]}

您可以轻松提取特定变量的值,并在需要时将其关联起来。

  

如果我在&#34; =&#34;旁边得到一个字符串而不是整数怎么办?登录?

     

...

     

string.scan(/(?:tariff)='[\p{Print}]+'/)

理解模式正在做什么很重要。正则表达式引擎有一些可能会极大地影响搜索速度的陷阱,因此不加区分地投入而不理解它们的作用可能会非常昂贵。

使用(?:...)时,您需要创建非捕获组。如果您只有一个项目,那么您没有必要进行匹配,也不是特别需要,因为它会让引擎做更多的工作。我唯一能做的就是当我需要回顾捕获的内容时,但是因为你只有一个可能的东西它会匹配,这就变成了一个没有实际意义的点。所以,你的模式应该简化为:

/tariff='[\p{Print}]+'/

使用时会导致:

%(tariff='abcdef abc a').scan(/tariff='[\p{Print}]+'/) 
# => ["tariff='abcdef abc a'"]

如果要捕获所分配的字符串的所有非空出现位置,则比您正在执行的操作更容易。我使用的东西是:

%(tariff='abcdef abc a').scan(/tariff='.+'/) 
# => ["tariff='abcdef abc a'"]

%(tariff='abcdef abc a').scan(/tariff='[^']+'/) 
# => ["tariff='abcdef abc a'"]

第二个更严格,可能更安全,因为它不会被一个有多个单引号的行欺骗:

%(tariff='abcdef abc a', 'foo').scan(/tariff='.+'/) 
# => ["tariff='abcdef abc a', 'foo'"]

%(tariff='abcdef abc a', 'foo').scan(/tariff='[^']+'/) 
# => ["tariff='abcdef abc a'"]

为什么这项工作是让你弄明白的。