2014-10-02 119 views
0

我需要你的幫助,RE:正則表達式 - 在URL字符串2之間數

我的原文是:tpl?nik=8942467302&regan=

我想只選擇這個號碼:8942467302

我使用正則表達式/(?<=nik=)(.*)&(?=regan)/,它選擇8942467302&

我不希望在比賽結束時「&」。我怎樣才能得到沒有尾隨「&」的號碼?

+0

make'。*'ungreedy'。*?'或者像這樣使用'/(?<= nik =)([^&] *)(?=&regan)/' – sln 2014-10-02 17:51:36

+0

你使用的是什麼正則表達式平臺/工具? – anubhava 2014-10-02 17:52:28

+0

將「&」移到預見範圍內會將其從整體匹配中排除,因爲您沒有消費任何東西,但仍保留標準。 – sln 2014-10-02 17:56:43

回答

0

我認爲你的正則表達式看起來不錯。 如果你確信NIK只是個數字,你可以這樣做:

(?<=nik=)(\d{1,})&(?=regan) 

你可以使用這個在線工具來測試您的正則表達式:
http://regex101.com/

就在正則表達式在頂部複製,並把您的測試以下字符串。

0
$ echo 'tpl?nik=8942467302&regan=' | egrep -o '[[:digit:]]+' 
8942467302 
0

移動到超前組「&」:

通過移動&以超前組,將導致其從比賽被排除:

s = 'tpl?nik=8942467302&regan= 
s[/(?<=nik=)(.*)(?=&regan)/] # => "8942467302" 

只提取組你想要,而不是整個比賽。

如上所述使用String#[]會返回整個匹配項。通過給它一組號碼,就可以讓它只返回你所感興趣的組,這樣,使用原來的正則表達式:

s = 'tpl?nik=8942467302&regan=' 
s[/(?<=nik=)(.*)&(?=regan)/, 1] # => "8942467302" 

使用URI解析庫

因爲你是從提取值一個URI,你可以使用Ruby的標準庫來提取你想要的參數:

require 'cgi' 
require 'uri' 

s = 'tpl?nik=8942467302&regan=' 
query = URI(s).query   # => "nik=8942467302&regan=" 
params = CGI::parse(query) # => {"nik"=>["8942467302"], "regan"=>[""]} 
nik = params["nik"].first  # => "8942467302" 

我建議這樣做。這是幾行代碼,但是處於更高層次的抽象。您可以從如何解析URI參數的詳細信息中釋放代碼。

0

謝謝大家的幫助!我使用這段代碼:/(?<=nik=)([^&]*)(?=&regan)/

相關問題