开发者

how to remove all [d+] except the last [d+]?

开发者 https://www.devze.com 2022-12-09 10:47 出处:网络
i have a string like /root/children[2]/header[1]/something/some[4]/table/tr[1]/links/a/b and /root/children[2]/header[1]/something/some[4]/table/tr[2]

i have a string like

/root/children[2]/header[1]/something/some[4]/table/tr[1]/links/a/b

and

/root/children[2]/header[1]/something/some[4]/table/tr[2]

how can i reproduce the string so that all the /\[\d+\]/ are removed except for the last /\[\d+\]/ ?

so i should end up with开发者_Python百科 .

/root/children/header/something/some/table/tr[1]/links/a/b

and

/root/children/header/something/some/table/tr[2]


No loops for you. Use a lookahead assertion (?= ... ):

s.gsub(/\[\d+\](?=.*\[)/, "")

There's a reasonable explanation of the very useful lookaround operators here


We will have to use while loop, I guess. And here comes good ol' C-style-loop solution:

while s.gsub!(/(\[\d+\])(.*?)(\[\d+\])/, '\2\3'); end

It's a bit hard to read, so I'll explain. The idea is that we match the string with a pattern that requires two [\d+] blocks to persist in a string. In the replacement, we just delete the first one. We repeat it until string doesn't match (so it contains only one such block) and utilize the fact that gsub! doesn't perform substitution when string is unmatched.


I'm absolutely certain there's a more elegant solution, but this ought to get you going:

string = "/root/children[2]/header[1]/something/some[4]/table/tr[1]/links/a/b"
count = string.scan(/\[\d+\]/).size
index = 0
string.gsub(/\[\d+\]/) do |capture|
  index += 1
  index == count ? capture : ""
end


Try this:

str.scan(/\[\d+\]/)[0..-2].each {|match| str.sub!(match, '')}
0

精彩评论

暂无评论...
验证码 换一张
取 消