Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在ruby中使用正则表达式计算子字符串?_Ruby_Regex_String - Fatal编程技术网

如何在ruby中使用正则表达式计算子字符串?

如何在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

我有一个非常大的xml文件,我将其作为字符串加载 因此,我的XML文件如下

<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工作,我肯定会