如何在ruby中使用正则表达式计算子字符串?
我有一个非常大的xml文件,我将其作为字符串加载 因此,我的XML文件如下如何在ruby中使用正则表达式计算子字符串?,ruby,regex,string,Ruby,Regex,String,我有一个非常大的xml文件,我将其作为字符串加载 因此,我的XML文件如下 <publication ID="7728" contentstatus="Unchanged" idID="0b000064800e9e39"> <volume contentstatus="Unchanged" idID="0b0000648151c35d"> <article ID="5756261" contentstatus="Changed" doi="10.1109/TNB
<publication ID="7728" contentstatus="Unchanged" idID="0b000064800e9e39">
<volume contentstatus="Unchanged" idID="0b0000648151c35d">
<article ID="5756261" contentstatus="Changed" doi="10.1109/TNB.2011.2145270" idID="0b0000648151d8ca"/>
</volume>
如何将ID转换为正则表达式
这是我尝试过的
searchstr = 'article ID=\"/[1-9]{7}/\" contentstatus=\"Changed\"'
count = ((xml.scan(searchstr).length)).to_s
puts count
请让我知道我如何才能做到这一点
谢谢您当前的字符串在我看来几乎完美,只需从数字周围删除错误的
/
:
searchstr = 'article ID=\"[1-9]{7}\" contentstatus=\"Changed\"'
您当前的字符串在我看来几乎完美无瑕,只需从数字周围删除错误的
/
:
searchstr = 'article ID=\"[1-9]{7}\" contentstatus=\"Changed\"'
如果XPath是一个选项,那么它是选择XML元素的首选方法。您可以使用选择器:
//article[@contentstatus="Changed"]
或者,如果可能:
count(//article[@contentstatus="Changed"])
如果XPath是一个选项,那么它是选择XML元素的首选方法。您可以使用选择器:
//article[@contentstatus="Changed"]
或者,如果可能:
count(//article[@contentstatus="Changed"])
我要冒险出去,猜想你对Ruby是新来的。首先,不需要将count转换为字符串来放置它。自动对您发送给它的任何内容进行调用 其次,用字符串操作处理XML很少是个好主意。我强烈建议您使用一个成熟的XML解析器,比如Nokogiri 也就是说,不能将正则表达式嵌入这样的字符串中。整个查询字符串需要是正则表达式 差不多
/article ID="[1-9]{7}" contentstatus="Changed"/
引号在正则表达式中不是特殊字符,因此不需要对其进行转义
如果对Ruby中的正则表达式有疑问,我建议您检查一下
我再次强调,我真的不允许通过正则表达式操纵XML。Nokogiri将使处理XML变得更加容易和可靠。我将冒一次险,猜测您是Ruby新手。首先,不需要将count转换为字符串来放置它。自动对您发送给它的任何内容进行调用 其次,用字符串操作处理XML很少是个好主意。我强烈建议您使用一个成熟的XML解析器,比如Nokogiri 也就是说,不能将正则表达式嵌入这样的字符串中。整个查询字符串需要是正则表达式 差不多
/article ID="[1-9]{7}" contentstatus="Changed"/
引号在正则表达式中不是特殊字符,因此不需要对其进行转义
如果对Ruby中的正则表达式有疑问,我建议您检查一下
我再次强调,我真的不允许通过正则表达式操纵XML。Nokogiri将使处理XML变得更加容易和可靠。是我推荐的Ruby XML解析器。它非常健壮,可能是现在语言的标准
我又添加了两篇“文章”来展示如何轻松地找到和操作内容,而不必依赖正则表达式
require 'nokogiri'
xml =<<EOT
<publication ID="7728" contentstatus="Unchanged" idID="0b000064800e9e39">
<volume contentstatus="Unchanged" idID="0b0000648151c35d">
<article ID="5756261" contentstatus="Changed" doi="10.1109/TNB.2011.2145270" idID="0b0000648151d8ca"/>
<article ID="5756262" contentstatus="Unchanged" doi="10.1109/TNB.2011.2145270" idID="0b0000648151d8ca"/>
<article ID="5756263" contentstatus="Changed" doi="10.1109/TNB.2011.2145270" idID="0b0000648151d8ca"/>
</volume>
EOT
doc = Nokogiri::XML(xml)
puts doc.search('//article[@contentstatus="Changed"]').size.to_s + ' found'
puts doc.search('//article[@contentstatus="Changed"]').map{ |n| "#{ n['ID'] } #{ n['doi'] } #{ n['idID'] }" }
>> 2 found
>> 5756261 10.1109/TNB.2011.2145270 0b0000648151d8ca
>> 5756263 10.1109/TNB.2011.2145270 0b0000648151d8ca
需要“nokogiri”
找到xml=2
>>575626110.1109/TNB.2011.2145270 0b0000648151d8ca
>>5756263 10.1109/TNB.2011.2145270 0b0000648151d8ca
将正则表达式与HTML或XML一起使用的问题是,如果XML发生更改,或者如果XML来自不同的源或格式不正确,它们很容易损坏。Regex从来没有被设计来处理这类问题,但解析器是。您可以使用每个标记后面都有行结尾的XML,或者根本没有,只要XML格式正确,解析器就不会真正关心。一个好的解析器,比如Nokogiri,甚至可以在XML被破坏的情况下进行修复,以便尝试理解它,但是我推荐使用Ruby XML解析器。它非常健壮,可能是现在语言的标准
我又添加了两篇“文章”来展示如何轻松地找到和操作内容,而不必依赖正则表达式
require 'nokogiri'
xml =<<EOT
<publication ID="7728" contentstatus="Unchanged" idID="0b000064800e9e39">
<volume contentstatus="Unchanged" idID="0b0000648151c35d">
<article ID="5756261" contentstatus="Changed" doi="10.1109/TNB.2011.2145270" idID="0b0000648151d8ca"/>
<article ID="5756262" contentstatus="Unchanged" doi="10.1109/TNB.2011.2145270" idID="0b0000648151d8ca"/>
<article ID="5756263" contentstatus="Changed" doi="10.1109/TNB.2011.2145270" idID="0b0000648151d8ca"/>
</volume>
EOT
doc = Nokogiri::XML(xml)
puts doc.search('//article[@contentstatus="Changed"]').size.to_s + ' found'
puts doc.search('//article[@contentstatus="Changed"]').map{ |n| "#{ n['ID'] } #{ n['doi'] } #{ n['idID'] }" }
>> 2 found
>> 5756261 10.1109/TNB.2011.2145270 0b0000648151d8ca
>> 5756263 10.1109/TNB.2011.2145270 0b0000648151d8ca
需要“nokogiri”
找到xml=2
>>575626110.1109/TNB.2011.2145270 0b0000648151d8ca
>>5756263 10.1109/TNB.2011.2145270 0b0000648151d8ca
将正则表达式与HTML或XML一起使用的问题是,如果XML发生更改,或者如果XML来自不同的源或格式不正确,它们很容易损坏。Regex从来没有被设计来处理这类问题,但解析器是。您可以使用每个标记后面都有行结尾的XML,或者根本没有,只要XML格式正确,解析器就不会真正关心。一个好的解析器,比如Nokogiri,甚至可以在XML被破坏的情况下进行修复,以试图理解它,但是@Xbox-Hello。“没用”没什么用。。。目前还不清楚预期会发生什么,会发生什么。你在问题中发布的代码怎么不起作用?它似乎工作,根据你是对的,它在红宝石工作良好。但是,我需要字符串出现的总计数,并且该计数返回为零。我应该更改什么才能显示正确的计数?@Xbox-Hello。“没用”没什么用。。。目前还不清楚预期会发生什么,会发生什么。你在问题中发布的代码怎么不起作用?它似乎工作,根据你是对的,它在红宝石工作良好。但是,我需要字符串出现的总计数,并且该计数返回为零。我应该更改什么才能显示正确的计数?回答得好,欢迎使用堆栈溢出!我在寻找原生RubyXML解析器的示例,但找不到(我对ruby一无所知)。非常感谢!!!这就成功了。最初我确实考虑过使用nokogiri,但不想安装额外的gems。如果我最终做了大量的XML工作,我肯定会使用nokogiri.xboxer21:Gems是语言中非常重要的一部分;不要害怕安装它们。大多数Ruby开发者在他们的开发机器上都有几十个;这是我一直安装的前三个gem中的一个。回答很好,欢迎使用stack overflow!我在寻找原生RubyXML解析器的示例,但找不到(我对ruby一无所知)。非常感谢!!!这就成功了。最初我确实考虑过使用nokogiri,但不想安装额外的gems。如果我最终做了大量XML工作,我肯定会