【发布时间】:2014-02-04 21:57:34
【问题描述】:
我正在编写 ruby,需要一些关于正则表达式的帮助。而且我真的是正则表达式的菜鸟。 我有一个这样的字符串
/hello/world
我想#gsub 这个字符串将第二个斜杠更改为 %2F。 我的挑战是忽略第一个斜线并更改仅第二个斜线。 我试过这个
[^/]/
但它在
中选择的不是纯斜线而是 o//hello/world
请帮帮我。谢谢!!
【问题讨论】:
我正在编写 ruby,需要一些关于正则表达式的帮助。而且我真的是正则表达式的菜鸟。 我有一个这样的字符串
/hello/world
我想#gsub 这个字符串将第二个斜杠更改为 %2F。 我的挑战是忽略第一个斜线并更改仅第二个斜线。 我试过这个
[^/]/
但它在
中选择的不是纯斜线而是 o//hello/world
请帮帮我。谢谢!!
【问题讨论】:
您可以简单地捕获组中斜线之前的字符并在替换中使用它,例如:
"/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。
现在是一个更丑陋、无正则表达式的替代方案:
"/hello/world".split("/").tap(&:shift).unshift("/").join("")
我会看到自己出来的。
【讨论】:
您需要在() 中使用子模式来查找子字符串:
/^\/(.*)$/
或
/^.(.*)$/
此模式不包括第一个字符。然后在这个子字符串中替换/
【讨论】:
(?!^\/)\/
http://rubular.com/r/IRWptAJdLs 是一个工作示例。
【讨论】:
将第二个/ 更改为%2F:
'/hello/world'.sub /(\/.*?)\//, '\1%2F'
#=> "/hello%2Fworld"
【讨论】: