1

クラス値「ruby」、「html」、「java」を抽出したい文字列の下にあります。ここでの私の目的は、私がいつも恐れていた正規表現を理解/学習することです:-)。

<div class="ruby" name="ruby_doc">
<div class="html" name="html_doc">
<div class="java" name="java_doc">

これは私がこれまでに持っているものです

str = <<END
<div class="ruby" name="ruby_doc">
<div class="html" name="html_doc">
<div class="java" name="java_doc">
END

str.scan(/"[^"]+/) #=> returns
["\"ruby", "\" name=", "\"ruby_doc", "\">\n<div class=", "\"html",...]

str.scan(/class="[^"]+/) #=> ["class=\"ruby", "class=\"html", "class=\"java"]

str.scan(/"(\w)+?"/) #=> [["ruby"], ["ruby_doc"], ["html"], ["html_doc"], ...]
4

5 に答える 5

7
str.scan(/\b(?<=class=\")[^"]+(?=\")/)
# => ["ruby", "html", "java"]
于 2013-09-15T14:47:18.793 に答える
3

これに使用します: Nokogiri

require 'nokogiri'

doc = Nokogiri::HTML::Document.parse <<-_html_
<div class="ruby" name="ruby_doc">
<div class="html" name="html_doc">
<div class="java" name="java_doc">
_html_

# to get values of class attribute
doc.xpath('//div/@class').map(&:to_s)
# => ["ruby", "html", "java"]
# to get values of name attribute
doc.xpath('//div/@name').map(&:to_s)
# => ["ruby_doc", "html_doc", "java_doc"] 
于 2013-09-15T14:30:25.167 に答える
2

HTML を正規表現で解析することはお勧めしません。ある程度大丈夫な正規表現を書かなければならない場合は、試してみることができます

 str.scan /<div\s+class=\s*"([^"]+)/
 #=> [["ruby"], ["html"], ["java"]]
于 2013-09-15T14:42:21.187 に答える
1

@Arupの回答に従って、Nokogiriを使用する必要があります。しかし、もしあなたが主張するなら...

str.scan(/(?:class\=\")(\w+)(?:\")/).flatten

Ruby コンソールでのライブ テスト

2.0.0p247 :001 > str = <<END
2.0.0p247 :002"> <div class="ruby" name="ruby_doc">
2.0.0p247 :003"> <div class="html" name="html_doc">
2.0.0p247 :004"> <div class="java" name="java_doc">
2.0.0p247 :005"> END
 => "<div class=\"ruby\" name=\"ruby_doc\">\n<div class=\"html\" name=\"html_doc\">\n<div class=\"java\" name=\"java_doc\">\n" 
2.0.0p247 :006 > str.scan(/(?:class\=\")(\w+)(?:\")/).flatten
 => ["ruby", "html", "java"] 
于 2013-09-15T14:42:27.733 に答える
-3

ハウサバウト:

str.scan /"(.*?)"/
#=> [["ruby"], ["ruby_doc"], ["html"], ["html_doc"], ["java"], ["java_doc"]]
于 2013-09-15T15:39:32.427 に答える