Ruby正则表达式提取键值

时间:2012-10-25 10:31:01

标签: ruby regex

我的字符串如下

case1:
str = "type=\"text/xsl\" href=\"http://skdjf.sdjhshf/CDA0000=.xsl\""
case2:
str = "href=\"http://skdjf.sdjhshf/CDA0000=.xsl\" type=\"text/xsl\""

我需要提取像

这样的值
 type -> text/xsl
 href -> http://skdjf.sdjhshf/CDA0000=.xsl

这是我的正则表达式失败。

 str.match(/type="(.*)"/)[1]
 #this works in second case
 =>"text/xsl"

 str.match(/http="(.*)"/)[1]
 #this works in first case
 =>"http://skdjf.sdjhshf/CDA0000=.xsl"

在失败的情况下,整个字符串都匹配。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

同意John Watts的评论。使用像nokogiri这样的东西来解析XML - 这是一件轻而易举的事。如果您仍然希望坚持使用正则表达式解析,您可以执行以下操作:

str.split(' ').map{ |part| part.match( /(.+)="(.+)"/ )[1..2] }

您将获得如下结果:

> str = "type=\"text/xsl\" href=\"http://skdjf.sdjhshf/CDA0000=.xsl\""
 => "type=\"text/xsl\" href=\"http://skdjf.sdjhshf/CDA0000=.xsl\"" 

> str2 = "href=\"http://skdjf.sdjhshf/CDA0000=.xsl\" type=\"text/xsl\""
 => "href=\"http://skdjf.sdjhshf/CDA0000=.xsl\" type=\"text/xsl\"" 

> str.split(' ').map{ |part| part.match( /(.+)="(.+)"/ )[1..2] }
 => [["type", "text/xsl"], ["href", "http://skdjf.sdjhshf/CDA0000=.xsl"]] 

> str2.split(' ').map{ |part| part.match( /(.+)="(.+)"/ )[1..2] }
 => [["href", "http://skdjf.sdjhshf/CDA0000=.xsl"], ["type", "text/xsl"]] 

你可以放入哈希或任何你想要的地方。

使用nokogiri,您可以获得一个节点,然后在您的情况下执行node['href']之类的操作。可能更容易。