2016-02-27 87 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"