【问题标题】:What is a regex for calculating two fields?什么是计算两个字段的正则表达式?
【发布时间】:2013-09-21 00:17:07
【问题描述】:

我有类似的 HTML:

<div id="c_pcnb" style="height:11px;width:4px;visibility:hidden;position:absolute;">

我想总结4px11px,但我不知道怎么做。我只是得到这些值,但我没有使用组和两个值。我该怎么做?

@sizes = (/height:([\d]+)px;width:([\d]+)px;visibility:hidden;position:absolute;/.match body_text)

我必须将高度 + 宽度相加。

当我尝试@sizes[1] + @sizes[2] 时出现错误。我做错了什么?

【问题讨论】:

  • 不要使用正则表达式解析 HTML。使用适当的 HTML 解析模块。 您无法使用正则表达式可靠地解析 HTML,并且您将面临悲伤和挫败感。一旦 HTML 与您的期望发生变化,您的代码就会被破坏。有关如何使用已经编写、测试和调试过的 Ruby 模块正确解析 HTML 的示例,请参阅 htmlparsing.com/ruby
  • @AndyLester 和 Arup 的回答,如果 11px;width:4px 是动态的,而不是 const 会怎样
  • 这是XY question;当您真正应该询问如何解析 HTML 以可靠地从中提取数据时,您想要一个使用正则表达式解析 HTML 的答案。

标签: ruby regex html-parsing


【解决方案1】:

试试这个:

'<div id=\"c_pcnb\" style=\"height:11px;width:4px;visibility:hidden;position:absolute;\">' \
     .scan(/\d+/) \
     .inject{|s,n| Integer(s) + Integer(n)}   #returns 15

示例 2:

'<div style=\"height:221px;width:47px;\">' \
   .scan(/\d+/).inject{|s,n| Integer(s) + Integer(n)} #=>268

它只是拾取所有(\d+),转换为Integer并提供Sum

css='<div id=\"c_pcnb\" style=\"height:11px;width:4px;visibility:hidden;position:absolute;\">' 
css.scan(/\d+/).inject{|s,n| Integer(s) + Integer(n)} #=> 15

【讨论】:

  • 还有 11px;width:4px 是动态的,不是 const
  • 我已经解释了它的作用。它不会将值视为常量。只需选择所有整数。解决方案是单行构造。注意 ``.
【解决方案2】:

我会这样做:

require 'nokogiri'

doc= Nokogiri::HTML::Document.parse <<-eotl
<div id="c_pcnb" style="height:11px;width:4px;visibility:hidden;position:absolute;">
eotl

hsh = Hash[*doc.at_css('#c_pcnb')['style'].split(/[:;]/)]
# => {"height"=>"11px",
#     "width"=>"4px",
#     "visibility"=>"hidden",
#     "position"=>"absolute"}
(hsh["height"].to_i + hsh["width"].to_i).to_s + 'px'
# => "15px"

【讨论】:

  • 谁能告诉我为什么这个解决方案被否决了。 HTML 不适合正则表达式。为什么这个标准被投反对票..?
  • 可能是因为您没有阅读问题?没有:怎么做更好更正确?什么是计算两个字段的正则表达式,但现在更好,或者永远nokogiri!问题是关于正则表达式的,我是新手,想先了解一下正则表达式
  • 但是,当我有 height:11px;width:4px;visibility:hidden;position:absolute; 时,它也不起作用一切正常,但是当高度:10 像素;宽度:15 像素;可见性:隐藏;位置:绝对;等它看不到它!
  • @ValdisAzamaris 你走错了路.. 现在是你的选择,当然.. 但不要认为因为这个原因而投反对票,有一些隐藏的原因,只有选民知道,上帝知道……我自己不知道。答案并没有那么糟糕,它消耗了 3 票。
  • Arup,一切都好,我学到了一些关于 nokogiri 的新知识,我将来会使用它,但现在呢)我现在你的解决方案更好......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 2011-06-15
  • 2015-06-09
相关资源
最近更新 更多