使用这段代码,它应该用它的 URL 替换一个 href 标记:
irb> s='<p><a href="http://localhost/activate/57f7e805827f" style="color:#F19300;font-weight:bold">Click here!</a></p>'
irb> s.gsub(/<a href="([^ '"]*)"([^>]*)?>([^<]*)<\/a>/, "#{$1}")
=> "<p></p>"
此正则表达式失败(未找到 URL)。然后我转义<
正则表达式中的字符,它可以工作:
irb> s.gsub(/<a href="([^ '"]*)"([^>]*)?>([^\<]*)<\/a>/, "#{$1}")
=> "<p>http://localhost/activate/57f7e805827f</p>"
1:根据RubyMine的检查,这种逃逸应该是没有必要的。它是否正确?如果是这样,为什么>
显然也没有必要逃脱?
2:之后在同一个 IRB 会话中,使用相同的字符串,原来的正则表达式突然也起作用了:
irb> s.gsub(/<a href="([^ '"]*)"([^>]*)?>([^<]*)<\/a>/, "#{$1}")
=> "<p>http://localhost/activate/57f7e805827f</p>"
这是因为再次$1
调用时变量没有清除吗?gsub
如果是这样,是故意行为还是 Ruby 正则表达式错误?
3:当我更改字符串并重新执行相同的命令时,$1
只会在更改后gsub
的字符串上调用两次后更改:
irb> s='<p><a href="http://localhost/activate/xxxxyyy" style="color:#F19300;font-weight:bold">Click here!</a></p>'
=> "<p><a href=\"http://localhost/activate/xxxxyyy\" style=\"color:#F19300;font-weight:bold\">Click here!</a></p>"
irb> s.gsub(/<a href="([^ '"]*)"([^>]*)?>([^\<]*)<\/a>/, "#{$1}")
=> "<p>http://localhost/activate/57f7e805827f</p>"
irb> s.gsub(/<a href="([^ '"]*)"([^>]*)?>([^\<]*)<\/a>/, "#{$1}")
=> "<p>http://localhost/activate/xxxxyyy</p>"
这是故意的吗?如果是这样,这背后的逻辑是什么?
4:作为替换字符,有的教程建议使用"#{$n}"
,有的建议使用'\n'
。使用反斜杠变体,不会出现上述问题。为什么-两者之间有什么区别?
谢谢!