【问题标题】:How do I use gsub to search and replace using a regex?如何使用 gsub 使用正则表达式进行搜索和替换?
【发布时间】:2013-07-24 13:09:50
【问题描述】:

我想从描述字符串中过滤掉标签,并将它们变成锚标签。我无法返回标签的值。

我的输入是:

a = "this is a sample #tag and the string is having a #second tag too"

我的输出应该是:

a = "this is a sample <a href="/tags/tag">#tag</a> and the string is having a <a href="/tags/second">#second</a> tag too"

到目前为止,我能够做一些小事,但我无法获得最终输出。这种模式:

a.gsub(/#\S+/i, "<a href='/tags/\0'>\0</a>")

返回:

"this is a sample <a href='/tags/\u0000'>\u0000</a> and the string is having a <a href='/tags/\u0000'>\u0000</a> tag too"

我需要做些什么不同的事情?

【问题讨论】:

  • 您可以使用nokogiri获得一些帮助。
  • @Priti 只是为了这个我不想在我的应用程序中添加 gem 的小东西
  • 如果这是 HTML 解析,那么 Nokogiri 将很有用。正是 HTML 生成显着降低了 Nokogiri 的价值。

标签: ruby regex string gsub


【解决方案1】:

你可以这样做:

a.gsub(/#(\S+)/, '<a href="/tags/\1">\0</a>')

你的替换不起作用的原因是你必须在双引号之间使用双转义

a.gsub(/#(\S+)/, "<a href='/tags/\\1'>\\0</a>")

注意这里不需要/i 修饰符。

【讨论】:

  • +1 用于指出 /i 是不需要的。原因是'#' 没有小写值,并且它后面的所有内容都与\S+ 匹配。
【解决方案2】:

如果你想对正则表达式中的匹配做一些事情,你需要给gsub一个块:

a.gsub(/#(\S+)/i) { "<a href='/tags/#{$1}'>##{$1}</a>" }

$1 是一个全局变量,Ruby 自动填充匹配字符串中的第一个捕获块。

【讨论】:

  • 正如其他答案所证明的那样,可以使用\1 来引用捕获,而无需将块传递给gsub。因此,虽然答案有效,但断言并不完全正确。
【解决方案3】:

试试这个:

a.gsub(/(?<a>#\w+)/, '<a href="/tags/\k<a>">\k<a></a>')

【讨论】:

  • 返回"this is a sample &lt;a href=\"/tags/#tag\"&gt;#tag&lt;/a&gt; and the string is having a &lt;a href=\"/tags/#second\"&gt;#second&lt;/a&gt; tag too"href 与问题中的指定不符)
  • 我认为这个答案不应该因为那个小错误而被否决。
  • 我同意,关键是使用命名捕获组的原则。
  • 在风格上,我可能会使用比 a 更长的捕获名称。它融入了模式对&lt;a href...&lt;/a&gt; 的使用,在阅读时会引起一些惊愕。我会使用?&lt;tagval&gt; 之类的东西来让它脱颖而出。
  • @DaveSexton: +1 我不知道在替换模式中使用命名捕获是可能的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-29
  • 1970-01-01
  • 2019-09-04
  • 2013-11-30
  • 1970-01-01
  • 2018-04-25
相关资源
最近更新 更多