從URI

2013-05-26 39 views
3

提取字符串和數字有條件的正則表達式我有這個樣子(etc可以是任何長度的)URI字符串:從URI

/7/ipsum/dolor/etc 
/2/not/17/ipsum/etc 

這是我想實現:拆分就今後的琴絃如果不是數字,則跳第二個和第三個匹配(["ipsum", "dolor"]["not", "17"]),丟棄第二個元素。期望的結果是["ipsum"]["not", "17"]

我用普通的ruby實現了這一點(通過將字符串分割成數組,然後檢查所需值的值)。有沒有更好的方法來使用正則表達式來做到這一點?

+2

我覺得這是更好地做你的方式 – Ven

+0

請給我們完整的'URL's。 –

+0

有一個允許簡單解析的URI模塊。你有沒有考慮過? – squiguy

回答

3

下面是一個可能的實現,並帶有擴展的文檔正則表達式。

def extract_parts_from(path) 
    pattern = %r{ 
    ^/[^/]+  # don't capture the first element 
    /([^/]+) # always capture the second element 
    /(?:(\d+)/)? # capture the third element if it's made up of digits 
    }x 
    path.match(pattern)[1,2].compact 
end 

測試:

["/7/ipsum/dolor/etc", "/2/not/17/ipsum/etc"]. each do |p| 
    p extract_parts_from(p) 
end 

結果:

["ipsum"] 
["not", "17"] 
+1

第三行可以簡化一下:'/(?:(\ d +)/)?' – pguardiario

+0

確實。那還是從早期的版本開始。現在改變它。 –

2

說明

,如果它是數字這個表達式將返回所述第二值和所述第三值。

^/(?:[^/]*/){1}([^/]*)/(?:(\d{1,})|[^/]*)/.*?$

^\/(?:[^\/]*\/){1}([^\/]*)\/(?:(\d{1,})|[^\/]*)\/.*?$這是同樣的表情卻正斜槓已經越獄的一些語言需要一個

enter image description here

  • ^匹配行
  • /比賽開始正斜槓
  • (?:[^/]*/)匹配後跟斜槓一組文本,該組由未捕獲
  • {1}匹配雖然在功能上相同+這給出dev的選擇斜線分隔的字段的X個跳過的能力通過簡單地改變括號內的值
  • ([^/]*)捕獲非斜線
  • /匹配的串斜線
  • (?:啓動非捕獲的組,這允許or條件以匹配只是所含表達式
  • (\d{1,})捕獲的一組數字,雖然在功能上相同+這給出dev的選擇最小的能力,並且如果必須存在通過簡單地改變括號
  • |或內部值的位數所需的最大數目
  • [^/]* match a group of text )非捕獲的組的端
  • /匹配下一個斜線
  • .*?$剩餘字符串匹配到一個行的末尾。

0接收整個匹配的字符串

  1. 接收第二值
  2. 接收第三值提供這是一個數

聲明

我不要Ruby ,所以我包含一個php示例來演示表達式的工作原理。

PHP代碼示例:

<?php 
$sourcestring="/7/ipsum/dolor/etc 
/2/not/17/ipsum/etc"; 
preg_match_all('/^\/(?:[^\/]*\/){1}([^\/]*)\/(?:(\d{1,})|[^\/]*)\/.*?$/im',$sourcestring,$matches); 
echo "<pre>".print_r($matches,true); 
?> 

$matches Array: 
(
    [0] => Array 
     (
      [0] => /7/ipsum/dolor/etc 
      [1] => /2/not/17/ipsum/etc 
     ) 

    [1] => Array 
     (
      [0] => ipsum 
      [1] => not 
     ) 

    [2] => Array 
     (
      [0] => 
      [1] => 17 
     ) 

) 
+0

過於複雜:在表達式無意義後放置「{1}」,「{1,}」與+相同,最後的「*」不起作用。 – pguardiario

+0

是的,在這種情況下使用{1}是沒有意義的,但它確實能夠讓程序員在開始匹配之前簡單地選擇他們想要跳過的字段的數量。包括或排除它不會改變最終輸出或整體功能。 –

+0

最後的'。*'允許正則表達式針對具有許多值的字符串。是的,如果輸入字符串是單個值,那麼'。*'是不必要的。由於OP的示例沒有指定具有單個uri的字符串,因此該解決方案按照問題解決了該問題。 –