正则表达式捕获除URL的第一部分之外的所有内容

时间:2016-02-27 19:36:46

标签: ruby regex url

假设我有以下网址:/members/some/path/route

我想要一个仅返回/some/path/route

的正则表达式

到目前为止,我有[^\/]\/.*

但是,当它返回s/some/path/route

时,它并没有起作用

有人可以帮我一把吗?我也喜欢它,如果有人可以告诉我为什么我的正则表达式不起作用,所以我可以了解它为什么不起作用。

我使用红宝石。

3 个答案:

答案 0 :(得分:1)

假设您使用的是javascript:

你的正则表达式将是

result = url.match(/(?:\/.*?)(\/.*)/g);

,您期望的字符串将保存在result[1]

如果使用 RUBY

if url =~ /(?:\/.*?)(\/.*)/
    result = $~[1]
end

OR

regexp = /(?:\/.*?)(\/.*)/
match = regexp.match(url)
if match
    result = match[1]
else
    result = ""
end

答案 1 :(得分:0)

你需要找到第二个" /"其余的

preg_match("/\/(.*?)(\/.*)/", $url, $preg);
print_r($preg);

返回

Array
(
    [0] => /members/some/path/route
    [1] => members
    [2] => /some/path/route
)

但是,我建议不要使用RegExp,因为它是一个简单的字符串,explode()函数会这样做

$path_array = array_slice(explode("/", $url), 2); // we are slicing at 2, because there is a leading '/' at the beginning
$new_path = "/".implode("/", $path_array);
echo $new_path;

答案 2 :(得分:0)

我不会使用正则表达式。相反,我会使用Pathname#each_filename来构造一个数组,其元素是路径的每个组成部分。

str = "/members/some/path/route"

require "pathname"

Pathname(str).each_filename.to_a[1..-1].join('/')
  #=> "some/path/route"

我们看到了:

Pathname(str).each_filename.to_a[1..-1]
  #=> ["members", "some", "path", "route"]

这使用类方法Kernel::Pathname。我找不到相应的文档(与Object的文档一样),但我们可以验证:

method(:Pathname).owner
  #=> Kernel

这与类方法Kernel::ArrayKernel::String和其他方法类似:

Array(21)   # => [21]
String(19)  # => "19"

你可以写一下:

Pathname.new(str).each_filename.to_a[1..-1].join('/')
  #=> "some/path/route"