2016-02-27 85 views
1

的第一段假设我有以下网址:/members/some/path/route正则表达式来捕获一切,但一个URL

我希望有一个正则表达式,将只返回/some/path/route

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

但是,因为它返回不起作用s/some/path/route

有人能帮我一把吗?如果有人能告诉我为什么我的正则表达式不起作用,我还想知道为什么它不起作用。

我使用的红宝石。

+0

你用什么语言?使用Javascript/C#/的Java/PHP? – Saleem

+0

哦,废话,你的权利! – Thermatix

+0

对不对?你没有提到语言名称 – Saleem

回答

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 
+0

关闭,但你有没有使用捕获组? – Thermatix

+0

嗯有趣但是团队有什么错? – Saleem

+0

嗯,我宁愿只使用:'url [/ regexthatononlyreturnseverythingafterthefirstsegment /]',但是它也可以工作:'(url [/(?:*/.*?)(\/.*)/];$ 1)'' – Thermatix

0

你需要找到第二个“/”,并采取其他

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

回报

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

不过,我建议不使用正则表达式,因为它是一个简单的字符串,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; 
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"