【问题标题】:Ruby—nested gsubs?Ruby——嵌套的 gsub?
【发布时间】:2018-08-17 14:03:04
【问题描述】:

我正在解析一个 txt 文件(一本古老的赞美诗书)。我想做以下事情:

  • 合唱团
  • 解析/净化该合唱的每一行

我试过这段代码:

chorus_regex = /([^0-9]+\n)+/
puts hymn.gsub(chorus_regex) {|match| match.gsub(/^([^0-9]+\n)/, "  \1")}

但是第二个gsub 只影响第一行?我认为这是因为\1 可能应用于第一个正则表达式,而不是第二个

TL;DR

如何编写嵌套的 gsub,以便您可以抓取 txt 块,对这些块执行 gsub,并用结果替换旧块?


编辑

我简化了正则表达式,所以问题集中在如何嵌套正则表达式 gsub,而不是被复杂的正则表达式或编码错误的字符分心。

【问题讨论】:

  • 举个例子会很有帮助。
  • 为什么你的文本文件包含“�”?这看起来像是一个损坏的编码。
  • @Stefan 是的,我正在清理一个相当破损的文档

标签: ruby gsub


【解决方案1】:

要嵌套 gsub,请确保为 gsub 使用块,并且可以使用 perlisms(第一组为 $1,等等)。

chorus_regex = /([^0-9]+\n)+/
puts hymn.gsub(chorus_regex) {|match| 
  match.gsub(/^([^0-9]+\n)/) { |line| 
    "  #{$1}"
  }
}

【讨论】:

  • 如果您想分享知识,最好想出一个不那么做作的更明确的例子,而不是这些奇怪的“�”。
  • @mudasobwa 这是我遇到的一个具体问题——然后我找到了解决方案,所以我把它放在这里,因为我在堆栈溢出的其他地方找不到它
  • 嵌套gsubs 的行为与嵌套maps、嵌套reduces 以及基本上任何接受块的嵌套函数完全相同。
猜你喜欢
  • 1970-01-01
  • 2010-12-31
  • 1970-01-01
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 2013-06-10
  • 2011-04-01
相关资源
最近更新 更多