【发布时间】:2017-04-20 04:11:10
【问题描述】:
我正在使用带有正则表达式的gsub 方法:
@text.gsub(/(-\n)(\S+)\s/) { "#{$2}\n" }
输入数据示例:
"The wolverine is now es-
sentially absent from
the southern end
of its European range."
应该返回:
"The wolverine is now essentially
absent from
the southern end
of its European range."
该方法工作正常,但 rubocop 报告和冒犯:
避免使用 Perl 风格的反向引用。
任何想法如何使用MatchData 对象而不是$2 重写它?
【问题讨论】:
-
也可以使用命名捕获(并将它们称为
\k<>):.gsub(/-\n(?<rest>\S+)\s/, "\\k<rest>\n")。 -
@mudasobwa:你的回答中有一个非常有趣的错误。我不明白这将取决于 gsub 历史记录。
-
@EricDuminil 发生这种情况是因为
$1包含最后一个匹配项,并且a = b被评估为RTL。 -
@mudasobwa:不仅仅是
a = b。s = "123"; s[p "2"] = p "1"输出"2"然后"1" -
@EricDuminil 好吧,确实如此。
""[p 2] = p 1打印2 1因为这是两个参数,传递给String#[]=(index, value)。正则表达式在那个阶段没有被评估,它只是被声明了。"#$1"是插值,它确实是就地扩展的。