Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.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字符串::gsub!突然停顿_Ruby_Regex_String_Gsub - Fatal编程技术网

Ruby字符串::gsub!突然停顿

Ruby字符串::gsub!突然停顿,ruby,regex,string,gsub,Ruby,Regex,String,Gsub,我正在编写一个非常简单的脚本来清理几十万个小XML文件。我当前的方法是遍历目录并(对于每个文件)读取文件,使用String::gsub进行所有更改(不确定这是否最好),然后将新内容写入文件。我的代码如下所示: Dir.entries('.').each do |file_name| f = File.read( file_name ) f.gsub!( /softwareiconneedsshine>(.|\s)*<\/softwareiconneedsshine>

我正在编写一个非常简单的脚本来清理几十万个小XML文件。我当前的方法是遍历目录并(对于每个文件)读取文件,使用
String::gsub
进行所有更改(不确定这是否最好),然后将新内容写入文件。我的代码如下所示:

Dir.entries('.').each do |file_name|

  f = File.read( file_name )

  f.gsub!( /softwareiconneedsshine>(.|\s)*<\/softwareiconneedsshine>/i, '' )
  f.gsub!( /<rating>(.|\s)*<\/rating>, '' )

  f.gsub!( /softwareIdentifiers>/, 'version_history>' )

  #some more regex's

  File.open( file_name, 'w' ) { |w| w.write(f) }

end
Dir.entries('.')。每个do |文件名|
f=文件.read(文件名)
f、 gsub!(/SoftwareIConneedsHine>(.|\s)*/i',)
f、 gsub!(/(.|\s)*,'')
f、 gsub!(/softwareIdentifiers>/,“版本\历史记录>”)
#再来点正则表达式
打开(文件名,'w'){| w | w.write(f)}
结束
这一切看起来都很好,但出于某种原因(我,为了我的生命,无法理解),程序似乎任意挂起在
gsub与前两个类似的命令。但是,它随机挂起(但仅在这些点上挂起)。有时它是有效的,有时只是挂起。我真的不明白为什么它有时会起作用,但不是所有其他时间


非常感谢您的帮助

在不了解任何关于您的环境或您正在阅读的文件类型的情况下,我建议尝试让您的kleene stars变得不贪婪。例如,将
(.|\s)*
更改为
(.|\s)*?

,效果出人意料地好,脚本执行得完美无瑕!但你能给我解释一下那到底是怎么回事吗,我还是不确定到底发生了什么??谢谢有关详细信息,请参见此处的
*
*?
说明:“贪婪”匹配从可能的最大匹配开始,并收缩它,直到找到正确的匹配。”“惰性”匹配从可能的最小匹配开始并扩展它。例如,以字符串abc“def”“ghi”jkl
为例。“贪婪的”正则表达式将匹配
“def”“ghi”
,“懒惰的”正则表达式将匹配
“def”
。我猜它试图在一个长文档中找到最长的匹配,所以遍历整个文档需要很长时间。@Ken Bloom-这实际上是一个相当小的文档@谢谢!这很有道理。