假设我有:
foo/fhqwhgads
foo/fhqwhgadshgnsdhjsdbkhsdabkfabkveybvf/bar
我想要更换'foo /'之后的所有内容,直到我达到'/',或者如果'/'从未到达,则直到行尾。对于第一部分,我可以使用这样的非捕获组:
(?<=foo\/).+
这就是我被卡住的地方。我可以像这样匹配第二个'/':
(?<=foo\/).+(?=\/)
但这对第一种情况没有帮助。期望的输出是:
foo/blah
foo/blah/bar
我正在使用Ruby。
答案 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
我太累了,想不出更好的方法,但我确信有一个。