【问题标题】:Regex to match string excluding first character正则表达式匹配不包括第一个字符的字符串
【发布时间】:2014-02-04 21:57:34
【问题描述】:

我正在编写 ruby​​,需要一些关于正则表达式的帮助。而且我真的是正则表达式的菜鸟。 我有一个这样的字符串

/hello/world

我想#gsub 这个字符串将第二个斜杠更改为 %2F。 我的挑战是忽略第一个斜线并更改仅第二个斜线。 我试过这个

[^/]/

但它在

中选择的不是纯斜线而是 o/
/hello/world

请帮帮我。谢谢!!

【问题讨论】:

    标签: ruby regex string gsub


    【解决方案1】:

    您可以简单地捕获组中斜线之前的字符并在替换中使用它,例如:

    "/hello/world".gsub(/([^\/])\//, '\1%2F') #=> "/hello%2Fworld"
    

    或者,如果您只想匹配出现在第一个字符之后的任何 /,您可以将其简化为:

    "/hello/world".gsub(/(.)\//, '\1%2F')     #=> "/hello%2Fworld"
    

    或者像这样:

    "/hello/world".gsub(/(?<!^)\//, '%2F')    #=> "/hello%2Fworld"
    

    【讨论】:

    • 当我们这样做的时候,"/hello%2Fwolrd".sub('lr', 'rl')。既然你用的是\1,不妨用sub
    • @CarySwoveland Woops 在测试时打错了字。谢谢
    • 我喜欢最后一张!谢谢!
    【解决方案2】:

    现在是一个更丑陋、无正则表达式的替代方案:

    "/hello/world".split("/").tap(&:shift).unshift("/").join("")
    

    我会看到自己出来的。

    【讨论】:

      【解决方案3】:

      您需要在() 中使用子模式来查找子字符串:

      /^\/(.*)$/
      

      /^.(.*)$/
      

      此模式不包括第一个字符。然后在这个子字符串中替换/

      【讨论】:

        【解决方案4】:

        (?!^\/)\/

        http://rubular.com/r/IRWptAJdLs 是一个工作示例。

        【讨论】:

        • ^ 这是正确答案。 "/hello/world".sub(/(?!^\/)\//, '') == "/helloworld"
        • 啧!啧!您建议对自我承认的“正则表达式菜鸟”使用负前瞻,没有解释!
        【解决方案5】:

        将第二个/ 更改为%2F

        '/hello/world'.sub /(\/.*?)\//, '\1%2F'
        #=> "/hello%2Fworld"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-02-09
          • 1970-01-01
          • 2019-01-05
          • 2023-03-31
          • 2020-06-30
          • 1970-01-01
          • 2016-04-21
          相关资源
          最近更新 更多