在'/'或字符串结尾之前捕获任意字符串

时间:2011-01-20 23:40:25

标签: ruby regex

假设我有:

foo/fhqwhgads
foo/fhqwhgadshgnsdhjsdbkhsdabkfabkveybvf/bar

我想要更换'foo /'之后的所有内容,直到我达到'/',或者如果'/'从未到达,则直到行尾。对于第一部分,我可以使用这样的非捕获组:

(?<=foo\/).+

这就是我被卡住的地方。我可以像这样匹配第二个'/':

(?<=foo\/).+(?=\/)

但这对第一种情况没有帮助。期望的输出是:

foo/blah
foo/blah/bar

我正在使用Ruby。

5 个答案:

答案 0 :(得分:3)

试试这个正则表达式:

/(?<=foo\/)[^\/]+/

答案 1 :(得分:1)

实施@ Endophage的回答:

def fix_post_foo_portion(string)
  portions = string.split("/")
  index_to_replace = portions.index("foo") + 1
  portions[index_to_replace ] = "blah"
  portions.join("/")
end

strings = %w{foo/fhqwhgads foo/fhqwhgadshgnsdhjsdbkhsdabkfabkveybvf/bar}
strings.each {|string| puts fix_post_foo_portion(string)}

答案 2 :(得分:0)

我不是红宝石开发者,但有一些相当于php的爆炸()所以你可以爆炸字符串,在第二个数组索引处插入一个新项目然后再次使用/内爆部分...当然你可以如果您只想在某些情况下进行切换,则匹配第一个数组元素。

答案 3 :(得分:0)

检查字符串结尾锚点$ - 以及/字符应该可以解决问题。您还需要将.+非贪婪更改为.+?,因为贪婪的版本将始终匹配到字符串的结尾,这是有机会的。

(?<=foo\/).+?(?=\/|$)

答案 4 :(得分:0)

['foo/fhqwhgads', 'foo/fhqwhgadshgnsdhjsdbkhsdabkfabkveybvf/bar'].each do |s|
  puts s.sub(%r|^(foo/)[^/]+(/.*)?|, '\1blah\2')
end

输出:

foo/blah
foo/blah/bar

我太累了,想不出更好的方法,但我确信有一个。