我试图在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';
我从网页上提取了上述文字,但我不知道如何单独提取该特定部分。
答案 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'"]
为什么这项工作是让你弄明白的。