2011-01-20 48 views
1

假设我有:捕获任意字符串或字符串的结尾

foo/fhqwhgads 
foo/fhqwhgadshgnsdhjsdbkhsdabkfabkveybvf/bar 

而且我想,如果'来代替以“富/”,直到我要么达到“/”的一切,或/'永远不会到达,然后直到行的末尾。对于第一部分,我可以使用这样的非捕获组:

(?<=foo\/).+ 

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

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

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

foo/blah 
foo/blah/bar 

我正在使用Ruby。

回答

3

试试这个正则表达式:

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

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

+1

Ruby支持'分裂( '/')`和`加入( '/')`。 – 2011-01-21 00:04:49

0

检查字符串尾部的锚点 - $ - 以及/字符应该有所斩断。您还需要通过将.+更改为.+?来使其非贪婪,因为如果有机会,贪婪版本将一直匹配到字符串的末尾。

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

试过这个,但它不适合我。处理完/后面的所有内容,作为捕获组的一部分。 – 2011-01-20 23:52:12

+0

@Ben:在这种情况下,您可能需要使捕获非贪婪(通过追加`?`)。我会编辑... – LukeH 2011-01-20 23:55:42

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

输出:

foo/blah 
foo/blah/bar 

我太累了,想一个更好的方式来做到这一点,但我敢肯定有是一个。

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)} 
相关问题