如何提取给定子字符串后的部分字符串?

时间:2016-08-02 19:05:09

标签: ruby

例如我有url字符串,如:

https://abc.s3-something.amazonaws.com/subfolder/1234/5.html?X-Amz-Credential=abcd12bhhh34-1%2Fs3%2Faws4_request&X-Amz-Date=2016&X-Amz-Expires=3&X-Amz-SignedHeaders=host&X-Amz-Signature=abcd34hhhhbfbbf888ksdskj

从这个字符串我需要提取在子文件夹/后面的数字1234。我试过用gsub但没有运气。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:3)

假设您的网址已保存在名为url的变量中。 然后,以下内容应返回1234

url.match(/subfolder\/(\d*)/)[1]

说明:

url.match(/     # call the match function which takes a regex
  subfolder\/   # search for the first appearance of the string 'subfolder/'
                # note: we must escape the `/` so we don't end the regex early
  (\d*)         # match any number of digits in a capture group,
/)[1]           # close the regex and return the first capture group

答案 1 :(得分:1)

url = 'http://abc/xyz'

index= url.index('/abc/')
url[index+5..length_of_string_you_want_to_extract]

希望,这有帮助!

答案 2 :(得分:1)

lwassink有正确的想法,但它可以更简单地完成。如果subfolder始终相同:

url = "https://abc.s3-something.amazonaws.com/subfolder/1234/5.html?X-Amz-Credential=abcd12bhhh34-1%2Fs3%2Faws4_request&X-Amz-Date=2016&X-Amz-Expires=3&X-Amz-SignedHeaders=host&X-Amz-Signature=abcd34hhhhbfbbf888ksdskj"

url[/subfolder\/\K\d+/]
# => "1234"

\K会丢弃匹配的文本,因此只返回"1234"

如果您想在任何子文件夹之后获取​​该号码,并且域名始终相同,您可以改为:

url[%r{amazonaws\.com/[^/]+/\K\d+}]
# => "1234"

答案 3 :(得分:1)

s.split('/')[4]

如果您愿意,最后添加.to_i

或者,将其键入一个子串,就像你要求的那样......

a = s.split '/'
a[a.find_index('subfolder') + 1]

或者,以单行为单位表示我可以:

s.split('/').tap { |a| @i = 1 + a.find_index('subfolder')}[@i]

或者,因为我是一个受损的人,我实际上会这样写:

s.split('/').tap { |a| @i = 1 + (a.find_index 'subfolder')}[@i]