2013-03-04 209 views
0

从XML字符串节点我有串XML象下面这样:获取使用正则表达式

<Query> 
    <Code>USD</Code> 
    <Description>United States Dollars</Description> 
    <UpdateTime>2013-03-04 02:27:33</UpdateTime> 
    <toUSD>1</toUSD> 
    <USDto>1</USDto> 
    <toEUR>2</toEUR> 
    <EURto>3</EURto> 
</Query> 

全部文本内容在同一行没有空格。我不能写正确的正则表达式模式。我想要得到象<to那样开始的节点。例如<toEUR>,<toUSD>

我该如何写这种模式?

+3

[请不要使用正则表达式XML(http://stackoverflow.com/questions/1732348/regex-match-open-tags-except -xhtml-self-contained-tags) – CAMOBAP 2013-03-04 16:40:58

+2

哪种语言?最好使用一个实际的XML库(或者xpath,或者任何其他的正则表达式)。 – 2013-03-04 16:41:16

+0

在Ruby中。对我来说这是一个简短的纯文本,所以我决定使用正则表达式。 – user1931951 2013-03-04 17:00:37

回答

-1

虽然普遍的共识是,XML解析等用正则表达式是不是要走的路,这样的事情应该做的伎俩:

<\s*(to[^>\s]+)[^>]*>([^<]+)<\s*/\s*\1\s*> 

在红宝石格式:

/<\s*(to[^>\s]+)[^>]*>([^<]+)<\s*\/\s*\1\s*>/ 

匹配<toWatever>value</toWhatever>返回参考组1返回名称(toWhatever)并且返回参考组2返回该值。

0

随着引入nokogiri和XPath函数starts-with

require 'nokogiri' 
doc = Nokogiri::XML <<EOF 
<Query> 
    <Code>USD</Code> 
    <Description>United States Dollars</Description> 
    <UpdateTime>2013-03-04 02:27:33</UpdateTime> 
    <toUSD>1</toUSD> 
    <USDto>1</USDto> 
    <toEUR>2</toEUR> 
    <EURto>3</EURto> 
</Query> 
EOF 

doc.search('//*[starts-with(name(),"to")]').map &:to_s 
#=> ["<toUSD>1</toUSD>", "<toEUR>2</toEUR>"]