2010-03-21 48 views
1

我有一個測試列表,我試圖捕獲使用正則表達式的數據。用於捕獲編號文本列表的正則表達式

這裏是文本格式的一個樣本:

(1) this is a sample string /(2) something strange /(3) another bit of text /(4) the last one/ something!/ 

我目前正確抓住了這個正則表達式,但我有一些困難使得它異常的條件下工作。

這裏是我的正則表達式

/\(?\d\d?\)([^\)]+)(\/|\z)/ 

不幸的是一些數據包含圓括號這樣的:

(1) this is a sample string (1998-1999) /(2) something strange (blah) /(3) another bit of text /(4) the last one/ something!/ 

的子 '(1998- 1999年)' 和 '(等等)' 使其失敗!

任何人都在意在這一個裂縫? 謝謝:d

+0

你沒有說究竟正則表達式應該捕捉到。 – user187291 2010-03-21 13:52:53

+0

對不起,更具體。我正在審查現在的答案急(至少2看起來正確)*咧嘴*我試圖捕獲我的示例捕獲的文本(即英文文本減去編號)。 – pchap10k 2010-03-21 13:58:40

回答

1

我想試試這個:

\((\d+)\)\s+(.*?)(?=/(?:\(\d+\)|\z)) 

這相當可怕的期待正則表達式執行以下操作:

  • 它看起來對包裹在括號中的一個或多個數字和捕捉他們。
  • 圓括號中的數字後面必須至少有一個空格字符。這個白色空間被忽略(未被捕獲);
  • 使用非貪婪通配符表達式。這是(imho)對於這類問題使用負面字符組(例如[^/]+)的最佳方式;
  • 陽性先行((?=...))表示,表達式必須跟反斜槓然後之一: 包裹在括號
    • 一個或多個數字;或
    • 字符串終止符。

爲了讓你在PHP爲例(不指定語言):

$s = '(1) this is a sample string (1998-1999) /(2) something strange (blah) /(3) another bit of text /(4) the last one/ something!/'; 
preg_match_all('!\((\d+)\)\s+(.*?)(?=/(?:\(\d+\)|\z))!', $s, $matches); 
print_r($matches); 

輸出:

Array 
(
    [0] => Array 
     (
      [0] => (1) this is a sample string (1998-1999) 
      [1] => (2) something strange (blah) 
      [2] => (3) another bit of text 
      [3] => (4) the last one/ something! 
     ) 

    [1] => Array 
     (
      [0] => 1 
      [1] => 2 
      [2] => 3 
      [3] => 4 
     ) 

    [2] => Array 
     (
      [0] => this is a sample string (1998-1999) 
      [1] => something strange (blah) 
      [2] => another bit of text 
      [3] => the last one/ something! 
     ) 

) 

一些注意事項:

  • 您不指定要捕獲的內容URE。我已經承擔了列表項目號和文本。在這種情況下,可能會錯誤地刪除那些捕獲括號。無論哪種方式,你可以得到整場比賽;
  • 我已經放棄了比賽的尾部斜線。這可能不是你的意圖。再次,改變捕捉以適合;
  • 我已經允許任何數量的數字的項目編號。你的版本只允許兩個。如果您喜歡這種方式,請將\d+替換爲\d\d?
+0

這當然是答案的勞斯萊斯。它也很好地捕捉了Ruby中的所有內容。格式化爲Ruby我使用這個... /\(\d+\).*?\/(?=\(|$)/ – pchap10k 2010-03-21 14:04:36

+0

Cletus:我剛剛注意到最後一個條目中的嵌入正斜槓正在被裁剪。我已經投票支持你了,現在我正在破譯正則表達式,但是你能否建議如何在正斜槓之後包含文本?Thx – pchap10k 2010-03-21 14:11:55

+0

@crunchyt你能解釋一下嗎?尾隨的'/',你想在第二個被捕獲的組?或者你的意思是別的嗎? – cletus 2010-03-21 14:16:36

1

添加前置/到字符串的開頭,附加一個(0)到字符串的末尾,那麼整個字符串與圖案\/\(\d+\)分裂,並丟棄所述第一和最後一個空元素。

1

只要/不能出現在文本...

\(?\d?\d[^/]+ 
+0

這很接近,但我需要在數字之間的整個字符串。 – pchap10k 2010-03-21 14:03:13