【问题标题】:Replace text in brackets gsub替换括号中的文本 gsub
【发布时间】:2014-12-30 04:43:45
【问题描述】:

我想替换括号内的文本,其中包含 colonu

例如,Here is a link [u:person]! 将变为 Here is a link <a href="/user/person">Person</a>! 我对正则表达式不是很有经验,而且我在使用 \1$1 时遇到问题

这是我现在使用的正则表达式:

string.gsub(/\[(\w*).*?\]/, "<a href='/user/\1'>\1</a>")

【问题讨论】:

    标签: ruby regex gsub


    【解决方案1】:

    制作正则表达式/\[\w*:(.*?)\]/,以便可以捕获person 而不是u。然后使用单引号字符串,这样\1 就不会被解释为\x01

    str = "Here is a link [u:person]!"
    puts str.gsub(/\[\w*:(.*?)\]/, '<a href="/user/\1">\1</a>')
    # => Here is a link <a href="/user/person">person</a>!
    

    【讨论】:

      【解决方案2】:

      我把你的正则表达式改成了这个,这样person就被捕获了:

      /\[\w*:(.*?)\]/
      

      然后用这个字符串替换它:

      "<a href=\"/user/#{$1}\">#{$1.capitalize}</a>"
      

      你很接近$1,它只需要被评估为 Ruby(使用字符串插值,在一个块内):

      string.gsub(/\[\w*:(.*?)\]/) { "<a href=\"/user/#{$1}\">#{$1.capitalize}</a>" }
      

      【讨论】:

      • 这失败了,因为$1 表示之前的正则表达式匹配。
      【解决方案3】:

      你可以使用这样的正则表达式:

      /\[u\:([\S]+)\]/
      

      并将其替换为:

      <a href='/user/#{$1}'>#{$1}</a>
      

      下面是正则表达式功能的细分:

      • 首先,我们有\[,它只是文字[ 字符
      • 接下来,我们有u\:,它们分别是文字u: 字符
      • 接下来,我们有([\S])。括号构成一个捕获组,这就是#{$1} 将在正则表达式的替换部分中填充的内容。 [\S]+ 查找所有非空白字符。
      • 最后,我们有 \],它只是文字 ] 字符。

      您的代码应如下所示:

      string.gsub('/\[u\:([\S]+)\]/', '<a href='/user/#{$1}'>#{$1}</a>')
      

      这里是正则表达式的实时测试:https://regex101.com/r/vK0iO2

      【讨论】:

        【解决方案4】:
        \[[^\]]*u:([^\]]*)\]
        

        试试这个。替换为&lt;a href='/user/\1'&gt;\1&lt;/a&gt;。查看演示。

        https://regex101.com/r/gX5qF3/13

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-12-03
          • 1970-01-01
          • 2015-05-08
          • 1970-01-01
          • 2016-12-08
          • 2019-03-10
          • 1970-01-01
          相关资源
          最近更新 更多